Objective-C 與 C++ 的異同

林堯彬發表於2020-04-04

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++ 支援;

 

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

 

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

 

 

Refence:

http://pierre.chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf

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

轉載於:https://www.cnblogs.com/y041039/archive/2012/07/26/2609810.html

相關文章