• <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>

            羅朝輝(飄飄白云)

            關(guān)注嵌入式操作系統(tǒng),移動平臺,圖形開發(fā)。-->加微博 ^_^

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

            Objective-C 與 C++ 的異同

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

            轉(zhuǎn)載請注明出處


            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/


            下面總結(jié)一下 Objective-C 與 C++ 的區(qū)別:


            1, 兩者最大的相同便是: 都是從 C 演化而來的面向?qū)ο笳Z言, 兩者都兼容標準 C 語言.


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


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


            4, 函數(shù)名字解析也不同,Objective C 的函數(shù)名字解析是函數(shù)名稱 + 參數(shù)名稱的, 而 C++ 只包括函數(shù)名稱。 因此在 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++ 里有的構(gòu)造函數(shù)和析構(gòu)函數(shù) 其對應物為 alloc-init/dealloc;


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


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


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


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


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


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

            評論

            # 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(重載),記得上一次看到是別人翻譯國外的一篇文章看到的。國內(nèi)很多人似乎一直把這兩個混為一談  回復  更多評論
              

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

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

            -(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現(xiàn)有class的一些selector的(不用生成新的class),C++貌似不行,除非繼承 :)  回復  更多評論
              

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

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

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

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

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

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

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

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

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

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

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

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

              回復  更多評論
              

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

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

            久久精品中文字幕第23页| 久久亚洲高清观看| 久久久久亚洲精品男人的天堂| 国产精品久久久久天天影视| 91精品观看91久久久久久| 久久国产精品无码网站| 国产成人精品三上悠亚久久| 国产成人久久精品区一区二区| 久久无码一区二区三区少妇| 伊人久久大香线焦AV综合影院 | 久久久久久久久久免免费精品| 午夜精品久久久内射近拍高清| 久久99国产乱子伦精品免费| 精品久久久久久无码中文野结衣 | 色婷婷久久久SWAG精品| 精品久久亚洲中文无码| 亚洲综合精品香蕉久久网97| 久久久久久久97| 久久久久黑人强伦姧人妻| 国内精品久久久久影院一蜜桃| 亚洲欧美日韩精品久久亚洲区 | av无码久久久久久不卡网站| 久久久久国产精品嫩草影院| 成人资源影音先锋久久资源网| 久久久久精品国产亚洲AV无码 | 成人精品一区二区久久| a级成人毛片久久| 久久久久人妻精品一区| 色狠狠久久综合网| 久久久久亚洲精品中文字幕| 日本免费一区二区久久人人澡| 97久久超碰国产精品2021| 日韩精品久久无码中文字幕| 亚洲精品无码久久千人斩| 99久久综合国产精品免费| 热久久国产欧美一区二区精品| 久久99精品九九九久久婷婷| 国产成人精品久久亚洲高清不卡| 久久青青草原国产精品免费| 香蕉久久一区二区不卡无毒影院| 26uuu久久五月天|