1、c++構造和析構的過程,類似於穿衣**的過程。穿衣是:先穿內衣,再穿外套。**是:先脫外套,再脫內衣。c++構造過程:首先呼叫父類構造方法,再呼叫子類構造方法。c++析構過程:首先呼叫子類析構方法,再呼叫父類析構方法。
2、子類不能繼承父類的構造方法和析構方法,除此之外,其他的成員都能繼承,包括父類的private成員,只不過子類不能訪問private成員。
3、思考一下,為什麼子類不能繼承父類的構造方法?
想一想,構造方法是幹什麼的?構造方法是初始化物件的成分,建立物件。從語義上講,父類構造方法初始化父類成分,構造父類物件。子類構造方法在父類物件的基礎上,初始化子類專有成分,構造子類物件。如果子類繼承父類構造方法,那麼子類暴露乙個介面,返回父類物件,這顯然不合理。因此,子類不能繼承父類的構造方法。
4、父類的成分只能在父類構造方法中初始化,子類只能初始化自己的專有成分,不能初始化父類的成分,可以在方法內賦值。子類如果初始化父類成分,編譯報錯:非法的成員初始化,不是基或成員。那麼問題來了,子類沒有繼承父類的構造方法,那麼子類如何初始化父類的成分呢?
5、子類不能繼承父類的構造方法,但是可以呼叫父類的構造方法,而且必須呼叫父類的構造方法,確保父類成分初始化。如果沒有顯示呼叫父類的構造方法,會隱式呼叫父類的default構造方法。子類沒有顯式呼叫父類構造方法,父類沒有提供default構造方法,編譯報錯:沒有合適的default構造方法可用。
6、構造過程可認為:父類成員初始化列表,父類構造方法內賦值,子類成員初始化列表,子類構造方法內賦值。
7、c++析構方法能不能被繼承,是有爭議的。個人認為不能繼承。有人說,不能繼承,為什麼子類可以呼叫。從語義上講,為什麼設計析構方法,析構方法撤銷物件的成分。父類析構方法撤銷父類的成分,子類構造方法撤銷子類專有的成分。
8、析構方法是一種特殊的方法。主要體現在:
a、子類可以顯式呼叫父類的析構方法;
b、子類不能隱藏父類的析構方法;
c、析構方法的重寫規則不同,一般的virtual成員方法,重寫要求方法名必須相同。析構方法的重寫,方法名不同,分別是父類名和子類名。同時,純虛的成員方法要求子類必須重寫,父類可以不實現。純虛的析構方法也要求子類必須重寫(使用者不重寫,編譯器會生成乙個重寫的析構方法),同時父類必須提供實現,因為必定要呼叫父類的析構方法。
9、子類構造方法必須呼叫父類構造方法,與此類似,子類析構方法執行完,必定呼叫父類的析構方法,可以認為子類析構方法執行完,建立乙個對父類析構方法的呼叫。即使子類析構方法重寫了父類的析構方法,子類析構方法執行完,還是要呼叫父類的析構方法。
10、那麼問題來了,不管有沒有重寫,子類析構方法執行完,都必定要呼叫父類的析構方法。那麼重寫析構方法還有什麼意義呢?
考慮,指標指向子類,指標的表面型別是父類,delete指標。如果沒有重寫析構方法,那麼delete動作直接呼叫父類的析構方法,而不是先呼叫子類的析構方法,再呼叫父類的析構方法。
11、物件的析構過程可認為:第一步,子類析構方法撤銷專有的成分,對於類型別,遞迴呼叫析構方法,對於內建型別不需要做什麼,可認為不再使用它占用的記憶體;第二步,呼叫父類的析構方法,對於類型別,遞迴呼叫析構方法,對於內建型別,不需要做什麼事,可認為不再使用它占用的記憶體。
12、什麼時候宣告析構方法為virtual呢?
當類中有virtual方法時,應該是宣告析構方法為virtual,為什麼?類中有virtual方法,意味著面向抽象程式設計,就會有父類指標指向子類物件。這種情況下,為了保證delete父類指標的時候,先呼叫子類析構方法(撤銷子類專有成分),再呼叫父類析構方法(撤銷父類成分),必須將父類析構方法宣告為virtual。
如果類中沒有virtual方法,不要宣告virtual析構方法,為啥?對於virtual,編譯器做了一些幕後工作,導致物件變大。
物件的構造和析構過程
物件的構造和析構過程不太清晰,特意做個筆記。定義value類 class value value value operator int nval void dump protected int m nval 定義乙個base類 class base virtual base virtual void...
C 構造和析構
include using namespace std class b b b b b b int i data i b operator b b private int data b play b b int main output constructed by parameter 5 destr...
C 構造和析構
建構函式的作用是給類中的資料成員初始化,在乙個類物件產生的時候自動呼叫,建構函式分為帶參構造 無參構造。他倆唯一的區別就是乙個有引數,乙個沒引數,視實際情況使用 class cmyc cmyc cmyc cmyc cmyc int a,float b,char ch 它在乙個類物件被建立的時候自動呼...