• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            羅朝輝(飄飄白云)

            關注嵌入式操作系統,移動平臺,圖形開發。-->加微博 ^_^

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              85 隨筆 :: 0 文章 :: 169 評論 :: 0 Trackbacks

            Objective-C 與 C++ 的異同

            羅朝輝(http://www.shnenglu.com/kesalin

            轉載請注明出處


            stackflow 上有同學提問"C++ 與 Objective-C 有什么異同?"樓下的提供的兩個資料挺不錯的.


            其一是: Pierre Chatelier 寫的 <From C++ to Objective-C version 2.1 en>

            下載鏈接:http://pierre.chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf


            其二便是: Michael Rutman 寫的 C++ Versus Objective-C:

            鏈接:http://www.mactech.com/articles/mactech/Vol.13/13.03/CandObjectiveCCompared/


            下面總結一下 Objective-C 與 C++ 的區別:


            1, 兩者最大的相同便是: 都是從 C 演化而來的面向對象語言, 兩者都兼容標準 C 語言.


            2, 兩者最大的不同便是: Objective C 是完全動態的,而 C++是部分動態的。
            Objective C 支持在運行時動態類型決議(dynamic typing),動態綁定(dynamic binding)以及動態裝載(dynamic loading);
            C++ 是編譯時靜態綁定,通過嵌入類(多重繼承)和虛函數(虛表)來模擬實現。
            Objective C 在語言層次上支持動態消息轉發,其消息發送語法為 [object function]; 而且C++ 為 object->function()。 兩者的語義也不同,在 Objective C 里是說發送消息到一個對象上,至于這個對象能不能響應消息以及是響應還是轉發消息都不會 crash; 而在 C++ 里是說對象進行了某個操作,如果對象沒有這個操作的話,要么編譯會報錯(靜態綁定),要么程序會 crash 掉的(動態綁定)。


            3, Objective C 不支持多重繼承, 而 C++ 支持。 不過 Objective C 通過 proxy(代理) 或 Category(類別) 可以更優雅地實現這一特性。這一點也包括了 overwriting(覆蓋) 和 overloading(重載) 兩者的不同。Objective C 不支持函數重載。


            4, 函數名字解析也不同,Objective C 的函數名字解析是函數名稱 + 參數名稱的, 而 C++ 只包括函數名稱。 因此在 Objective C 中以下是合法的,因為兩者解析出來分別類似于 foo:bar1: 和 foo:bar2: 是不同的:

            -(int)foo:(int) bar bar1:(int)bar;

            -(char*)foo:(int) bar bar2:(int)bar;

            而在 C++ 中以下是非法的, 編譯將出錯, 因為兩者解析出來都是類似于 foo:int, 編譯器無法辨別:

            int foo(int bar, int bar1);

            char* foo(int bar, int bar2);


            5, Objective-C 沒有 C++ 里有的構造函數和析構函數 其對應物為 alloc-init/dealloc;


            6, Objective-C 2.0 了加入了垃圾回收機制(在 iPhone 和 iPad 上不可用) 而 C++ 沒有;


            7, Objective-C 不允許在 Stack 上分配內存,只能在 heap 上進行,而 C++ 兩者都允許;


            8, Objective-C 不支持模板而 C++ 支持;Objective-C 不支持命名空間,而 C++ 支持;Objective-C 也不支持函數缺省默認參數,而 C++ 支持;


            10, Objective-C 是 Smalltalk 系的 而 C++ 是 Simula 系的。


            可以這么說 Objective-C 在 C 之上進行了一層簡潔的包裝, 而 C++ 在 C++ 之上進行了復雜的包裝, 但 Objective-C 讓人感覺更優雅簡潔。


            posted on 2010-12-26 12:30 羅朝輝 閱讀(10472) 評論(7)  編輯 收藏 引用 所屬分類: 移動開發Cocoa 開發

            評論

            # re: Objective-C 與 C++ 的異同 2010-12-26 17:07 wu
            -(int)foo:(int) bar1;
            -(char*)foo:(int) bar2;

            這兩個是不同的嗎?  回復  更多評論
              

            # re: Objective-C 與 C++ 的異同 2010-12-27 09:53 rix
            又見overwriting(覆蓋) 和 overloading(重載),記得上一次看到是別人翻譯國外的一篇文章看到的。國內很多人似乎一直把這兩個混為一談  回復  更多評論
              

            # re: 【Apple】Objective-C 與 C++ 的異同 2011-06-09 22:42 羅朝輝
            @wu

            這兩個是相同的,以下兩個是不同的,原文中舉例不當,已經修改過來了。

            -(int)foo:(int) bar bar1:(int)bar;
            -(char*)foo:(int) bar bar2:(int)bar;  回復  更多評論
              

            # re: 【Apple】Objective-C 與 C++ 的異同 2011-06-24 17:55 D
            @rix
            Objective-c是可以overwriting現有class的一些selector的(不用生成新的class),C++貌似不行,除非繼承 :)  回復  更多評論
              

            # re: 【Apple】Objective-C 與 C++ 的異同 2011-08-30 04:18
            沒用過Objective C,不了解你說的overwriting,不過你把overloading和overriding已經給搞混了,看看你自己寫的或者轉貼的其它文章就知道了。

            另外你對優雅的理解很膚淺。若以C為標準,無論是調用還是消息不過是語法糖罷了。不是說只能以C為標準,很多人(尤其是喜歡玩各種語言的)在這個問題上不理解,覺得動輒說C的都是只會C的菜鳥,其實真正有實踐經驗的就知道,二進制接口才是絕對的王,而現在最通用的二進制接口是C接口。而在接口背后,沒有壓根沒有什么優雅不優雅的問題,只有基于需求的考慮外加口味問題。

            而C++提供的模板則并非僅僅是糖,而是一種在保證約束的情況下進行的編譯期自動化代碼生成機制。這是一種質的不同。當然C++在語法糖相關的部分做的不是太到位,比如lambda是stateless的不能攜帶閉包等等,但最讓人頭痛的其實還是最終到C接口的轉換所造成的工作量;倒不是說有多大,而是說這些都是無聊的繁文縟節。從根本上是因為C++的糖不是整體考慮的、而是一塊一塊粘起來的。

            任何語言要想真正超越C++,需要的是運行期或運行前、編譯后這個“期”進行代碼自動生成的機制。這個.NET做了一部分,但出于M$的動機和大公司的局限性,也很不到位(甚至.NET下除了C++/CLI連編譯期生成都是缺少要素的,比如特化等等)。

            不是語言承載現實中的任務和項目,恰恰相反是現實中的任務和項目承載語言,因為無論是自然語言還是編程語言,它最大的價值來自于使用。所以雖然我也曾經很fan“優雅”一類的形容詞,現在卻很明白,誰說這些詞,誰就是偏離了真正的航道,他們(至少在語言評價方面的)觀點就不值一提。

            不過,語言的缺陷確實真實的存在,但缺陷不是比較出來的,而是真正的設計缺陷,比如python 2.x中變量的作用域。恩又廢話了,匿了。  回復  更多評論
              

            # re: 【Apple】Objective-C 與 C++ 的異同 2011-08-30 13:39 羅朝輝
            @呃

            誠然,我是筆誤了,將 overriding(重載) 寫成 overwrting(重寫,覆蓋),但是沒有將它們搞混:
            override 一般是子類重寫(覆蓋)父類的方法,以實現與父類不同的行為;
            overload 是重載,一般是用于在一個類里面實現若干同名但參數形式不同的重載方法,

            我明白你的境地,C, C++, Obj-C 三種相比,C 無疑是最簡潔,運行效率最高的;C++ 無疑是最復雜也很強大的;Obj-C 最優雅的,沒有C++ 的復雜難以掌握,但也足夠簡潔高效,最重要的是易學易用。

            都說學 C/C++ 的必有三個境界,C入門,唯C++,回歸 C。但是在這后不妨再去了解了解其他的語言,Obj-C或動態語言。jjHou 總結過 C++ 就像是個熔爐,包括四種編程范式在里面。至于你說的模版并非僅僅是一直自動代碼生成機制,它是完備的范型編程范式。

            我不想在這里比較語言的優劣,也不想詳談 C++的大而全,復雜易誤用等。C++ 以打補丁的形式增加了很多語法糖,無論是它的過去還是現在都說不上優雅。語言只是一種工具而已,在同樣的應用環境下,哪一種語言能被更快,更容易地掌握,應用,推廣,能讓編程者所想即可所用,就足以證明它是優雅的。

            你不妨去了解一下 Obj-C,討論也需要有些背景知識的。

              回復  更多評論
              

            # re: [Cocoa]Objective-C 與 C++ 的異同[未登錄] 2012-06-16 01:33 1
            至于這個對象能不能響應消息以及是響應還是轉發消息都不會 crash

            我看很多這么說,而實際呢,如果因為筆誤寫錯一個方法調用立刻crash.  回復  更多評論
              

            日产精品久久久久久久性色| 亚洲国产另类久久久精品黑人 | 国产精品99久久免费观看| 99久久国产主播综合精品| 国产亚洲精久久久久久无码77777| 品成人欧美大片久久国产欧美| 久久久亚洲欧洲日产国码是AV| 久久996热精品xxxx| 国产69精品久久久久777| 亚洲中文久久精品无码| 中文字幕亚洲综合久久| 久久无码AV中文出轨人妻| 97超级碰碰碰碰久久久久| 性做久久久久久久久浪潮| 久久国内免费视频| 色综合久久天天综合| 久久精品九九亚洲精品天堂 | segui久久国产精品| 99久久精品免费看国产一区二区三区 | 久久精品国产久精国产思思| 久久99精品久久久大学生| 国产香蕉97碰碰久久人人| 蜜臀av性久久久久蜜臀aⅴ麻豆| 久久国产成人| 亚洲国产精品婷婷久久| 久久久亚洲欧洲日产国码二区| 久久这里只有精品首页| 久久久久亚洲AV综合波多野结衣| 伊人久久精品影院| 日日噜噜夜夜狠狠久久丁香五月 | 久久久精品久久久久影院| 精品99久久aaa一级毛片| 色综合久久最新中文字幕| 99久久精品午夜一区二区| 久久久久亚洲AV无码专区体验| 久久久噜噜噜久久熟女AA片| 亚洲va中文字幕无码久久| 狠狠精品久久久无码中文字幕| 亚洲国产精品无码久久98| 伊人久久综合成人网| 久久婷婷国产综合精品|