建構函式與析構函式

2021-07-31 01:57:14 字數 1735 閱讀 5304

一、建構函式:

二、析構函式

在使用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 物件...