Objective-C和C++的區別?

Tags: 區別, 物件, 職業, word,

和C++不同,Objective-C不支援運運算元過載(它不支援ad-hoc多型)。亦與C++不同,但和Java相同,Objective-C只容許物件繼承一個類別(不設多重繼承)。Categories和protocols不但可以提供很多多重繼承的好處,而且沒有很多缺點,例如額外執行時間過重和二進位制不相容。

1、單一繼承

和Java、Smalltalk一樣,Objective-C不支援多重繼承。

而C++語言支援多重繼承。

2、動態

Objective-C是動態定型(dynamicaly typed),它的類庫比C++容易操作。Objective-C 在執行時可以允許根據字串名字來訪問方法和類,還可以動態連線和新增類。

C++ 跟從面向物件程式設計裡的Simula 67(一種早期OO語言)學派,而Objecive-C屬於Smalltalk學派。

在C++裡,物件的靜態型別決定你是否可以傳送訊息給它,而對Objective-C來說,由動態型別來決定。Simula 67學派更安全,因為大部分錯誤可以在編譯時查出。 而Smalltalk學派更靈活,比如一些Smalltalk 看來無誤的程式拿到Simualr67那裡就無法通過。

從很多方面來看,C++和Objective-C的差別,與其說是技術上的, 不如說是思維方式上的。你是否想更安全而捨棄靈活性?Simular67學派的支持者稱既然程式設計出色何必再要靈活性,而 Smalltalk學派則稱為了靈活可以容忍執行時多出錯。

3、優缺點

Apple在其Mac OS X 10.3中仍未引入垃圾回收這個功能。不過令人欣慰的是在Apple釋出的Xcode4中已經支援自動釋放(不等同於嚴格意義上的垃圾回收,因為兩者機制不同)。在Xcode4中的自動釋放,也就是ARC(Automatic Reference Counting)機制,不需要使用者手動去Release一個物件,而是在編譯期間,編譯器會自動幫你新增[NSObject release]。

另一個問題是Objective-C不包括名稱空間機制(namespace mechanism),取而代之的是程式設計師必須在其類別名稱加上字首,時常引起衝突。在2004年,在Cocoa程式設計環境中,所有Mac OS X類和函式均有“NS”作為字首,例如NSObject或NSButton,以表明它們屬於Mac OS X核心(使用“NS”是由於這些類和函式在NeXTSTEP開發時定下的)。

雖然Objective-C是C的超集,但它不視C的基本型為第一級的物件。

和C++不同,Objective-C不支援運算子過載(它不支援ad-hoc多型)。亦與C++不同,但和Java相同,Objective-C只容許物件繼承一個類別(不設多重繼承)。

由於Objective-C使用動態執行時型別,而且所有的方法都是函式呼叫(有時甚至連繫統呼叫(syscalls)也如此),很多常見的編譯時效能優化技術失效(例如:行內函數、常數傳播、互動式優化、純量取代與聚集等)。這使得Objetive-C效能劣於類似的物件抽象語言(如C++)。不過Objective-C擁護者認為既然Objective-C執行時消耗較大,Objective-CC本來就不應應用於C++或Java常見的底層抽象。

相關問題答案