2010-02-01 41 views
1

尊敬的先生!什麼是不是在Java中的OOP功能,但C++有這些功能?

因爲我還沒有學習java,但大多數人都說C++比Java有更多的OOP特性,所以我想知道C++具有哪些功能,而java不具備哪些功能。請解釋。

+8

尊敬的先生?我可以習慣這一點。 – GManNickG

+1

'goto'和'#define':) –

+0

問題是C++不僅僅是一種OO語言(它具有很多來自其他類型編程的特性)。 Java只是一種OO語言。所以在C++中有很多與OO無關的功能,而Java都不支持這些功能。 –

回答

5

這可能是有爭議的,但一些作者說,使用自由函數可能比書寫方法更適合面向對象。所以按照作者的觀點,C++中的自由函數使得它比Java更具OO(不具有它們)。

解釋是有一些操作沒有真正執行對象的一個​​實例,而是外部的,並且對這些情況具有外部定義的操作改進了OO設計。有些情況是對兩個對象的操作,這兩個對象本身並不是任何一個操作。增加一個值顯然是對該值的一種操作,但用另外兩個(或連接)的總和創建一個新值並不是真正對該實例的操作。當你寫:不上a進行

String a = "Hello"; 
String b = " World"; 
String c = a.append(b); 

append操作:手術後a仍然是「你好」。該操作不在b上執行,它是在ab上執行的外部操作。在這個特定的例子中,實現這個操作的最OO方式是提供一個帶有兩個參數的新構造函數(畢竟,這個操作是在新的字符串上執行的),但另一種解決方案是提供一個外部函數append需要兩個字符串並返回第三個字符串。

在這種情況下,如果兩個實例的類型都是相同的,那麼該操作自然可以作爲該類型的靜態方法執行,但是當混合不同類型時,操作並不是真正的一部分,它可能最終會成爲完全不同的類型。在某些情況下,免費函數與Java類中的Java一樣是僞造的,它不代表任何OO元素,但相當簡單的粘合方式是將靜態方法綁定到自由函數上,因爲該語言不支持前者。請注意,所有這些算法都不在集合上執行,也不在包含的類型的實例上執行。

+2

你可以在DDJ上閱讀關於「非成員函數如何改進封裝」的文章http://www.ddj.com/cpp/184401197 –

+0

感謝@dtrosset,我試圖自己找到引用。 –

+0

+1因爲我認爲Java「每個函數都在一個類中」*不鼓勵*這種有用的思考方式,但正如你所說,你實際上可以完全「僞造」免費函數,所以我不會說Java語言*禁止* 這個。 –

4

C++是一個巨大的語言和C++開發人員在開發過程中只使用一小部分是很常見。這些語言特性經常被認爲是C++最難以掌握和經常避免的部分。

+1

+1:Template Metaprogramming是shiznit。 – Narfanator

+7

模板元編程有時非常有用,但它不是真正的OOP功能。 –

+0

當然你是對的,模板元編程不是一個面向對象的功能。我將它包括在內,因爲Java和C++都有泛型,但模板實現是非常不同的。謝謝你保持誠實:-) – mikelong

1

在C++中,您可以繞過OO模型並構建自己的東西,而在Java中,VM決定您不能。非常簡化,但你知道......誰有時間。

+0

你的gravatar *在動畫形式* *更好* – ergosys

+0

我知道。我認爲它會動畫,但我會採取我能得到的。 –

6

java.sun.com

的Java省略了許多很少使用,知之甚少,混淆的C++功能,在我們的經驗比帶來利多的悲傷。這些省略的特性主要由運算符重載(儘管Java語言確實有方法重載),多重繼承和廣泛的自動強制組成。

有關更詳細的比較,請查看此Wikipedia page

+0

我同意。一些C++功能被認爲是不好的做法...有些人。 –

+2

@Josh:如果初學者驅動程序濫用,某些C++功能被認爲是不好的。我們這些擁有先進駕駛執照的人都喜歡所有功能,並且不會濫用它們(因爲我們可能已經學會了爲什麼它很糟糕的難題)。 –

+0

我想說關於MI的令人困惑的事情不是MI本身,而是如何指定基類的虛擬或非繼承,而不是派生類來控制它。 –

1

我想有些人會考慮運算符重載面向對象的功能(如果你查看二元運算符沒有太大的不同,然後類方法)。

1

要小心。那裏有多種OOP的定義。例如,Wegner 87和Booch等人91中的定義與人們在Java is not pure a OOP language中所說的不同。

所有這些「我的語言比你的語言更OO」東西有點沒有意義,IMO。