析構函式與建構函式

2021-08-22 10:11:59 字數 2165 閱讀 7085

建構函式的作用是保證每個物件的資料成員都有何時的初始值。

析構函式的作用是**記憶體和資源,通常用於釋放在建構函式或物件生命期內獲取的資源。

一般我們都知道構造和析構的次序:

構造從類層次的最根處開始,在每一層中,首先呼叫基類的建構函式,然後呼叫成員物件的建構函式。析構則嚴格按照與構造相反的次序執行,該次序是唯一的,否則編譯器將無法自動執行析構過程。

建構函式和析構函式都是由編譯器隱式呼叫的。這些函式的呼叫順序取決於程式的執行進入和離開例項化物件時所在的那個作用域的順序。一般而言,析構函式的呼叫順序和建構函式的呼叫順序相反,但是,物件的儲存類可以改變析構函式的呼叫順序。

對於在全域性作用域中定義的物件,它們的建構函式是在檔案中所有其他函式(包括main)開始執行之前被呼叫的(但無法保證不同檔案的全域性物件建構函式的執行順序)。對應的析構函式是在終止main之後呼叫的。

exit函式會迫使程式立即終止,而不會執行自動物件的析構函式。這個函式經常用來在檢測到輸入錯誤或者程式所處理的檔案無法開啟時終止程式。

abort函式與exit函式功能相似,但它會迫使程式立即終止,而不允許呼叫任何物件的析構函式。abort函式通常用來表明程式的非正常終止。

自動區域性變數的建構函式是在程式的執行到達定義這個物件的位置時呼叫的,而對應的析構函式是在程式離開這個物件的作用域時呼叫的(即定義這個物件的**完成了執行)。每次執行進入和離開自動物件的作用域時,都會呼叫它的建構函式和析構函式。如果程式呼叫了exit或abort函式而終止,則不會呼叫自動物件的析構函式。

靜態區域性物件的析構函式只呼叫一次,即執行首次到達定義這個物件的位置時。對應的析構函式是在main終止或程式呼叫exit函式時呼叫的。

全域性物件和靜態物件是以建立它們時相反的順序銷毀的。如果程式由於呼叫了exit函式而終止,則不會呼叫靜態物件的析構函式。

下面的demo演示了在幾個作用域不同的儲存類的createanddestory的類的物件,它們的建構函式和析構函式的呼叫順序。

#include

#include

using

namespace

std;

class

demo

;demo::demo(

int id,

string messagestring)

demo::~demo()

void

create

(void)

;

demo first

(1,「(main 前的全域性物件)」)

;

//在全域性作用域下定義first物件。它的建構函式是在執行main中的任何語句之前呼叫的

//而它的析構函式是在已經執行了所有其他物件的析構函式之後,程式終止時呼叫

int _tmain(

int argc, _tchar* argv)

void

create

(void)

執行結果:

object 6 destructor runs (cerate 函式裡的本地靜態物件)

object 3 destructor runs (main函式中的本地靜態物件)

object 1 destructor runs (main函式前的全域性物件)

分析:main函式中宣告了3個物件,second物件,fourth物件,是區域性自動物件,而third物件是乙個靜態區域性物件。當執行到達物件的宣告位置時,才會呼叫這些物件的建構函式。

當執行到達mian的末尾時,首先呼叫fourth物件的析構函式,然後是second物件的析構函式。由於third物件是靜態的,因此它會存活到程式終止。呼叫third物件的析構函式的時機,是在呼叫全域性物件first的析構函式之前,但在所有其他物件被銷毀之後。

create函式宣告了3個物件,其中fifth和seventh是區域性自動物件,sixth是靜態區域性物件。當create終止時,首先呼叫seventh物件的析構函式,然後是fifth物件的析構函式。由於sixth物件是靜態的,因此它會存活到程式終止。呼叫sixth物件的析構函式的時機,是在呼叫third和first的析構函式之前,但在所有其他物件被銷毀之後。

建構函式與析構函式

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

建構函式與析構函式

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

建構函式與析構函式

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