Objective-C 與 C++區別是本文要結束的內容,主要是通過兩者的區分學習,我們學習起來更方便些。不多說,我們來看詳細內容。
1、兩者最大的相同便是: 都是從 C 演化而來的物件導向語言, 兩者都相容標準 C 語言.
2、兩者最大的不同便是: Objective C 提供了運行期動態綁定機制, 而C++ 是編譯時間靜態繫結, 並通過嵌入類(多重繼承)和虛函數(虛表)來類比實現. Objective C 在語言層次上支援動態訊息轉寄, 其函數調用文法為 [object function], 而且C++ 為 object->function(). 兩者的語義也有不同,
在 Objective C 裡是說發送訊息到一個對象上, 至於這個對象能不能處理訊息(也就是說實現了這個函數與否)以及是處理還是轉寄訊息都不會 crash, 而在 C++ 裡是說對象進行了某個操作,如果對象沒有這個操作的話,要麼編譯會報錯(靜態繫結),要麼程式會 crash 掉的(動態綁定).
3、Objective C 不支援多重繼承, 而 C++ 支援. 不過 Objective C 通過 proxy(代理) 和 Category(類別) 可以更優雅地實現這一特性. 這一點也包括了 overwriting(覆蓋) 和 overloading(重載) 兩者的不同.
4、函數名字解析也不同, Objective C 的函數名字解析是函數名稱 + 參數名稱的, 而 C++ 只包括函數名稱. 因此在 Objective C 中以下是合法的,因為兩者解析出來分別類似於 foo:bar1 和 foo:bar2, 是不同的;
-(int)foo:(int) bar1; //原作者“Objective C 的函數名字解析是函數名稱 + 參數名稱”這裡的參數名其實是指 “參數描述”,只有在兩個以及兩個以上的參數時才能有這麼個意思。作者是直接將形參值的名字作為參數描述了,而且要說明這一點概念舉例也不正確。
- -(char*)foo:(int) bar2;
(更正,原文對此的解釋有錯誤,Objective-c 中沒有重載,O-C只認函數名包括參數描述))
要想實作類別似重載的功能,只有先用NSNumber或者NSValue將參數裝起來再作為參數,很笨的,不智能。
而在 C++ 中以下是非法的, 編譯將出錯, 因為兩者解析出來都是類似於 foo:int, 編譯器無法辨別.
- int foo(int bar1);
- char* foo(int bar2);
5、Objective-C 沒有 C++ 裡有的建構函式和解構函式, 其對應物為 alloc-init/free .
6、Objective-C 2.0 了加入了記憶體回收機制(在 iPhone 和 iPad 上不可用), 而 C++ 沒有.
7、Objective-C 不允許在 Stack 上分配記憶體, 只能在 heap 上進行, 而 C++ 兩者都允許.
8、Objective-C 不支援引用, 而 C++ 支援.
9、Objective-C 不支援模板, 而 C++ 支援.
10、Objective-C 是 Smalltalk 系的, 而 C++ 是 Simula 系的.
可以這麼說 Objective-C 在 C 之上進行了一層簡單的封裝, 而 C++ 在 C++ 之上進行了複雜的封裝, 但 Objective-C 讓人感覺更優雅簡潔
小結:詳解Objective-C 與 C++區別的內容介紹完了,希望本文對你有所協助!