C 全域性物件構造和析構

2021-07-03 21:20:58 字數 2365 閱讀 8657

*【注】此為小白引導教程

【引入】c++中的全域性物件什麼時候執行建構函式?什麼時候執行析構函式?與區域性物件又有什麼區別?

【正文】

思路是這樣的,我們先寫乙個類,乙個有點簡單「又不簡單」的類

#include 

#include

using

std::string;

using

std::cout;

using

std::endl;

class a

~a()

private:

string str;

};

我們寫乙個類用作區域性和全域性物件的型別,自然要知道在**構造在**析構,於是加了個string作為private成員記錄位置。

類寫好了開始寫測試程式主體

a test1("全域性");

int main()

編譯執行,結果如圖。

可以發現,全域性物件先於區域性物件構造,後於區域性物件析構。

我們可以擴充套件**(以下**無法編譯通過)

/***************

以下**無法編譯通過

***************/

#include

#include

using

std::string;

using

std::cout;

using

std::endl;

class a

~a()

string str;

};//定義,假設不自動構造

a test1;

//構造

test1.a("全域性");

int main()

//析構(主動式)

test1.~a();

這樣就便於理解了。

【擴充套件】

我們知道,在c/c++中結束程式不止有return,還有c stdlib.h中的exit(int)、abort(void),unistd.h中的_exit(int),c++的throw。

我們先來試下exit(int)

可以看到全域性物件完整地構造析構,而main中的區域性物件只完成了構造,未析構。

從exit(int)的特性來說,結果是正確的,exit(int)結束了main函式,並沒有直接結束了程式,而全域性物件儲存在data資料段中由程式聯立的執行時**析構(對於小白來說姑且這麼叫著)。

我們再來看_exit(0)

#include 

int main()

結果如圖

我們可以看出,不管是全域性還是區域性物件,都並未析構,說明_exit(int)是直接結束了程式的程序,並未丟擲異常。

我們再來看看會丟擲異常的abort()

#include 

int main()

結果如圖

可見abort()與_exit(int)的區別是會丟擲異常!

好了,聊了這麼久的c庫函式,我們來看看c++的內建throw

int main()

結果如圖

至此,我們都應該了解了c++中的全域性物件什麼時候執行建構函式,什麼時候執行析構函式,與區域性物件又有什麼區別。

小白教程就是在文章最後作者並不會總結,小白自己總結去吧!

C 多個物件構造 析構 構造和析構的順序

include 多個物件構造和析構 1 當類中有成員變數是其它類的物件時,首先呼叫成員變數的建構函式,呼叫順序與宣告順序相同 之後呼叫自身類的建構函式 2 析構函式的呼叫順序與對應的構造函式呼叫順序相反 2 類成員中若有const修飾,必須在物件初始化的時候,給const int n 賦值 當類成員...

區域性物件與全域性物件的構造和析構

例程除錯,很多細節問題。可以單步除錯後,切入到反彙編進行觀察。include pch.h include include include include using namespace std namespace nmsp1 命名空間 a int m i void func a obja 現用現定義...

C 物件的構造和析構

一 建構函式 1 宣告 1 c 中的類可以定義與類名相同的特殊成員函式,這種與類名相同的成員函式叫做建構函式 語法 classname 2 建構函式在定義時可以有引數 3 沒有任何返回型別的宣告。2 呼叫 自動呼叫 一般情況下c 編譯器會自動呼叫建構函式 手動呼叫 在一些情況下則需要手工呼叫建構函式...