*【注】此為小白引導教程
【引入】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 編譯器會自動呼叫建構函式 手動呼叫 在一些情況下則需要手工呼叫建構函式...