一、建構函式:
二、析構函式
在使用new生成物件時,會自動根據引數呼叫合適的建構函式,在
delete
物件時,會自動呼叫析構函式進行清理操作。在類定義時,如果沒有顯示的給出構造、析構函式,編譯器會自動新增預設的構造、析構函式。
建構函式與析構函式的呼叫:在生成物件時呼叫建構函式,物件消亡時呼叫析構函式.
1、若建構函式和析構函式為私有的,則只能在類中的方法裡呼叫建構函式生成物件(這種用法可以限制生成物件的個數,比如,單例模式),在類內部呼叫析構函式。所以在類外面就不能使用
new和
delete
運算子來建立物件和釋放物件。一般只會在單例模式,工廠模式等特殊情況下會這樣使用,私有的建構函式
+ 公有的析構函式。 2
、若建構函式為公有的,則可以在任意位置生成該類的物件。
析構函式為公有的,則在執行delete或離開物件的作用域時呼叫析構函式3、
在主函式中顯式呼叫建構函式,或在類的方法中返回乙個建構函式物件。生成乙個臨時的物件,在執行完該函式所在的語句後釋放該臨時物件。一般不建議這樣使用。
比如:static
testclass testclass::newinstance()
main
函式中:
testclass tt = testclass::newinstance();
//ok
testclass *tt1 = &testclass::newinstance();
//error
雖然編譯沒有出錯,但執行的時候就可能發生不可預知的錯誤了。
返回編**如下
00166849 lea eax,[ebp-108h]
0016684f push eax
00166850 call testclass::newinstance (0161127h)
00166855 add esp,4
00166858 mov dword ptr [ebp-128h],eax
0016685e mov ecx,dword ptr [ebp-128h]
00166864 mov dword ptr [tt1],ecx
00166867 lea ecx,[ebp-108h]
0016686d call testclass::~testclass (0161253h)
4、建構函式中對成員的初始化方式:
classa
那麼a的建構函式中有兩種方式初始化a,
b,c
第一種:
a::a(intx,float y,char z)
這是常規的初始化方式,我們可以以這種方式來初始化任何變數。
第二種:
a::a(intx, float y, char z):a(x), b(y), c(z)
這裡,我們在建構函式頭的地方,緊接著進行變數的初始化(包括呼叫基類的建構函式)。
兩種方式的比較,第一種方式在定義物件時,先分配一塊儲存空間,然後初始化為
0,然後按照建構函式的內容進行初始化。第二種方式在定義物件時,在分配空間之後,就使用記憶體複製函式進行初始化,然後再用建構函式中的內容對其他的成員進行初始化。
所以我們一般推薦使用第二種方式對基本型別成員初始化,對於其他複雜的結構成員用第一種方式初始化。
建構函式與析構函式
建構函式 主要作用就是為物件初始化。有一點要說的是,在繼承體系彙總,如果在建構函式中,如果沒有指定基類的建構函式,那麼編譯器會在建構函式開頭加入,基類的預設建構函式,這樣就可以初始化基類物件部分 析構函式 對於析構函式,要說的多點,實際也不太複雜,就是加入了virtual 使其具有了多型性質 inc...
建構函式與析構函式
建構函式 先看看建構函式的呼叫順序規則,只要我們在平時程式設計的時候遵守這種約定,任何關於建構函式的呼叫問題都能解決 建構函式的呼叫順序總是如下 1.基類建構函式。如果有多個基類,則建構函式的呼叫順序是某類在類派生表中出現的順序,而不是它們在成員初始化表中的順序。2.成員類物件建構函式。如果有多個成...
建構函式與析構函式
概述 乙個類有兩種特殊的成員函式 建構函式與析構函式。建構函式功能是在建立物件時,給資料成員賦初值,即物件的初始化。析構函式的功能是釋放乙個物件,在物件刪除前,用它做一些記憶體釋放工作,與建構函式的功能相反。建構函式 在物件建立時它會被自動執行,因此變數 物件的初始化 一般都放在建構函式中。1 物件...