C++和PHP在面性對象特性上的對比

對比PHP與C++學習的過程中來深入研究一下他們的面向對象特性:

構造函數
C++中子類的構造函數默認會調用父類的構造函數,而PHP中不會;C++中你必須有一個默認的構造函數,這個構造函數必須在沒有參數的時候也可以執行,而PHP中沒有這個要求,你甚至可以不需要構造函數,如果你的某個函數沒有使用類中的對象,你甚至可以將它按static 類型函數來使用。

protected效用的區別:
一個有protected成員變量(假設爲i)的類型Base,他的子類Derived直接繼承自Base,同時Derived有一個成員函數func,他的參數是Base類型的,這個函數可以訪問Base對象的protecte的成員嗎?在C++中不可以,而在PHP中可以。


關於重載:
PHP中不支持C++中的重載,重新定義個函數(不管是參數相同還是不同,都會導致重複定義錯誤)。PHP有自己的重載方法,而且比C++中的更廣泛,他不僅可以重載函數(通過使用__call()方法),還可以重載成員變量(通過使用__get()和__set())。而C++中只能對函數進行重載,而且重載的方法只有:不同的參數類型,不同的函數修飾符(const)。


關於abstract和interface
PHP中有這兩個修飾符,因爲PHP不支持對一個普通類的多繼承,因此interface用於實現多繼承。Abstract類在C++中也存在,只是實現方式不一樣,C++中使用pure virtual函數來表明這個類是抽象類,不能單獨被實例化。而PHP中不僅可以使用函數的修飾符abstract(另外class前也必須標明abstract)來標明這個意思,也可以只使用abstract修飾符修飾class更直接的表明他是抽象類。另外, C++中的pure virtual函數不受訪問類型的限制,不管是什麼訪問類型,都會被看作是public;而php中的abstract函數不能被聲明成private,僅此而已。


多態
因爲PHP是弱類型語言,所以他的多態性到處都有體現,導致他的多態性不像C++中那麼明顯。比如,在PHP中基類的函數可以看作全是virtual的,因此它不需要加任何修飾符,子類中和基類同名的函數都會被動態調用,而C++不一樣,如果基類中的這個函數沒有加virtual修飾符,子類中的那個同名函數就不會被動態調用,只能靜態調用了。

操作符重載
PHP中不存在,而C++存在。重點在==操作符,在PHP中他可以運用在任何類型上,即使這個類型沒有(像C++中一樣)寫自己的==重載函數。PHP中對於對象的比較,==表示兩個對象的屬性和值都一樣,而且類型也一樣;PHP也存在一個===操作符,表示他們引用了同一個對象,這跟java中很像吧。


final關鍵字
PHP中存在這個關鍵字,表示這個函數不能被重寫(如果他用來修飾函數),或者類不能被繼承(如果用類修飾class)。而C++中沒有這個關鍵字,也無法模擬出那個效果。


對象賦值和拷貝
C++中的拷貝或者賦值大致有這三種方式,一種是指針的賦值,即p1 = &obj,相當於PHP和java中的賦值操作;另一種是memberwise assignment,也就是在obj1 = obj2時發生的事情,默認情況下執行淺度拷貝,和PHP中clone的效果一樣。他可以通過重載賦值拷貝操作來執行你的深度拷貝或者其他自定義的拷貝,這就相當於PHP中的__clone()成員函數;第三種是memberwise initialization,也就是在參數傳遞時,傳遞返回值時或者包含對象的容器初始化的時候自動運行的,你可以通過自己定義拷貝構造函數來控制它的效果。拷貝構造函數在PHP中幾乎用不到,因爲他的傳遞是完全按引用傳遞,而不是對象的直接拷貝。

 

 

最終我們這樣對應起來:

PHP C++
一般的成員函數 vitrual函數(非純虛)
abstract function pure virtual function
clone =
__clone() 拷貝賦值操作重載
final N/A
__call($funname, $args)    函數重載
__get(); __set() 成員變量重載
= * = * (兩邊都表示指針)   
=== * == *

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章