• <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.  回復  更多評論
              

            久久久精品国产亚洲成人满18免费网站 | 久久精品国产精品国产精品污| 久久中文骚妇内射| 99国产精品久久久久久久成人热| 亚洲国产精品久久久久婷婷软件| 久久久青草青青国产亚洲免观| 亚洲精品国产第一综合99久久| 精品久久久久久久久午夜福利| 国产精品永久久久久久久久久| 久久中文字幕精品| 久久精品国产99国产电影网| 天天综合久久一二三区| 日韩精品久久无码中文字幕| 久久精品一区二区影院| 亚洲精品美女久久777777| 久久精品国产精品亜洲毛片| 97久久香蕉国产线看观看| 热久久最新网站获取| 草草久久久无码国产专区| 久久久久久久亚洲Av无码| 伊人精品久久久久7777| 欧美日韩中文字幕久久伊人| 久久精品国产99久久无毒不卡| 久久久久高潮综合影院| 国产精品熟女福利久久AV| 久久91亚洲人成电影网站| 久久久久久久久久久久中文字幕 | 婷婷久久综合九色综合九七| 国产精品久久久久影院嫩草| 人妻少妇久久中文字幕| 中文成人久久久久影院免费观看| 久久成人国产精品一区二区| 日本免费一区二区久久人人澡| 亚洲国产欧美国产综合久久| 亚洲av伊人久久综合密臀性色| 热久久最新网站获取| 狠狠色丁香婷婷久久综合| 久久婷婷人人澡人人爽人人爱| 一级a性色生活片久久无| 亚洲欧洲久久av| 国产色综合久久无码有码|