建構函式與析構函式

2021-06-29 02:05:16 字數 1403 閱讀 5244

建構函式

建構函式與類同名,沒有返回型別,可過載

需要注意的是,在初始化物件時,呼叫的是其建構函式或拷貝建構函式,而不會呼叫賦值函式,這是因為賦值運算子是在乙個現存的物件被賦予新的值的時候才被呼叫,而拷貝建構函式在呼叫期間,這個物件還處於未決狀態

建構函式不能是虛函式,若是給建構函式加上virtual ,編譯是不能通過的。這是為什麼呢?這是因為在呼叫建構函式的時候,虛函式表裡面還是空的,如果宣告建構函式為虛函式,則動態聯編無法實現。同理,拷貝建構函式也不能虛函式,賦值建構函式也不能是虛函式。

自定義建構函式可以給每個類成員初始化,冒號與花括號之間的是初始化列表。有一點要注意的是,初始化成員的順序不是按照初始化列表的順序,而是按照在類中宣告的順序。

析構函式

析構函式可以是虛函式,若宣告基類的析構函式為虛函式,存在乙個基類指標指向派生類物件的時候,會呼叫派生類和基類的析構函式。然而,若基類的析構函式不是虛函式時,只會呼叫基類的析構函式,這就會導致派生類部分釋放不徹底了。看下面的例子,在這個例子中基類的析構函式沒有宣告是虛函式,於是程式執行之後只呼叫了基類的析構函式

class base

base(const base &other)

~base()

base &operator=(const base &other)

};class derived:public base//預設繼承是私有

還有乙個很有意思的地方,用new構造乙個派生類物件給基類物件時,析構函式和建構函式的呼叫次序是很有意思的:

class base

base(const base &other)

virtual ~base()

base &operator=(const base &other)

};class derived:public base//預設繼承是私有

~derived()

derived &operator=(const derived &other)

derived(const derived &other)

};int main()

執行結果如下:

建構函式與析構函式

建構函式 主要作用就是為物件初始化。有一點要說的是,在繼承體系彙總,如果在建構函式中,如果沒有指定基類的建構函式,那麼編譯器會在建構函式開頭加入,基類的預設建構函式,這樣就可以初始化基類物件部分 析構函式 對於析構函式,要說的多點,實際也不太複雜,就是加入了virtual 使其具有了多型性質 inc...

建構函式與析構函式

建構函式 先看看建構函式的呼叫順序規則,只要我們在平時程式設計的時候遵守這種約定,任何關於建構函式的呼叫問題都能解決 建構函式的呼叫順序總是如下 1.基類建構函式。如果有多個基類,則建構函式的呼叫順序是某類在類派生表中出現的順序,而不是它們在成員初始化表中的順序。2.成員類物件建構函式。如果有多個成...

建構函式與析構函式

概述 乙個類有兩種特殊的成員函式 建構函式與析構函式。建構函式功能是在建立物件時,給資料成員賦初值,即物件的初始化。析構函式的功能是釋放乙個物件,在物件刪除前,用它做一些記憶體釋放工作,與建構函式的功能相反。建構函式 在物件建立時它會被自動執行,因此變數 物件的初始化 一般都放在建構函式中。1 物件...