Objective-C 與 C++ 的異同
羅朝輝(http://m.shnenglu.com/kesalin)
轉(zhuǎn)載請(qǐng)注明出處
stackflow 上有同學(xué)提問"C++ 與 Objective-C 有什么異同?"樓下的提供的兩個(gè)資料挺不錯(cuò)的.
其一是: 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言, 兩者都兼容標(biāo)準(zhǔn) C 語言.
2, 兩者最大的不同便是: Objective C 是完全動(dòng)態(tài)的,而 C++是部分動(dòng)態(tài)的。
Objective C 支持在運(yùn)行時(shí)動(dòng)態(tài)類型決議(dynamic typing),動(dòng)態(tài)綁定(dynamic binding)以及動(dòng)態(tài)裝載(dynamic loading);
C++ 是編譯時(shí)靜態(tài)綁定,通過嵌入類(多重繼承)和虛函數(shù)(虛表)來模擬實(shí)現(xiàn)。
Objective C 在語言層次上支持動(dòng)態(tài)消息轉(zhuǎn)發(fā),其消息發(fā)送語法為 [object function]; 而且C++ 為 object->function()。 兩者的語義也不同,在 Objective C 里是說發(fā)送消息到一個(gè)對(duì)象上,至于這個(gè)對(duì)象能不能響應(yīng)消息以及是響應(yīng)還是轉(zhuǎn)發(fā)消息都不會(huì) crash; 而在 C++ 里是說對(duì)象進(jìn)行了某個(gè)操作,如果對(duì)象沒有這個(gè)操作的話,要么編譯會(huì)報(bào)錯(cuò)(靜態(tài)綁定),要么程序會(huì) crash 掉的(動(dòng)態(tài)綁定)。
3, Objective C 不支持多重繼承, 而 C++ 支持。 不過 Objective C 通過 proxy(代理) 或 Category(類別) 可以更優(yōu)雅地實(shí)現(xiàn)這一特性。這一點(diǎn)也包括了 overwriting(覆蓋) 和 overloading(重載) 兩者的不同。Objective C 不支持函數(shù)重載。
4, 函數(shù)名字解析也不同,Objective C 的函數(shù)名字解析是函數(shù)名稱 + 參數(shù)名稱的, 而 C++ 只包括函數(shù)名稱。 因此在 Objective C 中以下是合法的,因?yàn)閮烧呓馕龀鰜矸謩e類似于 foo:bar1: 和 foo:bar2: 是不同的:
-(int)foo:(int) bar bar1:(int)bar;
-(char*)foo:(int) bar bar2:(int)bar;
而在 C++ 中以下是非法的, 編譯將出錯(cuò), 因?yàn)閮烧呓馕龀鰜矶际穷愃朴?foo:int, 編譯器無法辨別:
int foo(int bar, int bar1);
char* foo(int bar, int bar2);
5, Objective-C 沒有 C++ 里有的構(gòu)造函數(shù)和析構(gòu)函數(shù), 其對(duì)應(yīng)物為 alloc-init/dealloc;
6, Objective-C 2.0 了加入了垃圾回收機(jī)制(在 iPhone 和 iPad 上不可用), 而 C++ 沒有;
7, Objective-C 不允許在 Stack 上分配內(nèi)存,只能在 heap 上進(jìn)行,而 C++ 兩者都允許;
8, Objective-C 不支持模板,而 C++ 支持;Objective-C 不支持命名空間,而 C++ 支持;Objective-C 也不支持函數(shù)缺省默認(rèn)參數(shù),而 C++ 支持;
10, Objective-C 是 Smalltalk 系的, 而 C++ 是 Simula 系的。
可以這么說 Objective-C 在 C 之上進(jìn)行了一層簡(jiǎn)潔的包裝, 而 C++ 在 C++ 之上進(jìn)行了復(fù)雜的包裝, 但 Objective-C 讓人感覺更優(yōu)雅簡(jiǎn)潔。