********************在這裡我們會通過乙個例子來給大家解釋說明****************************
#include using namespace std;
class test
{public:
test(int a = 5,int b = 5):ma(a),mb(b)
{ cout<
1: 因為物件t1處於全域性中,所以t1最先被構造,呼叫建構函式
2:由於物件t5 也處於全域性中,所以t5第二被構造,呼叫建構函式
3:在main函式中:t2在最前面,所以第三被構造,呼叫建構函式
4:物件t3呼叫拷貝建構函式(t3之前不存在),t2拷貝構造t3,所以第四被構造,呼叫拷貝建構函式
5:注釋//4這一行是重點:原本先呼叫建構函式產生臨時量(test(30,30)),在呼叫=運算子過載將臨時量賦給t4,在呼叫析構函式析構臨時量;
但是,這一過程會被編譯器給優化掉,不產生臨時量,直接構造新物件。所以,那一行的**的含義是:::直接呼叫建構函式構造t4
6:注釋//5這一行也是重點:由於t2之前已經存在,所以它的含義是:構造臨時物件,在呼叫賦值函式,最後在呼叫析構函式析構臨時量,注意不是析構t2物件。
7:注釋//6:呼叫顯式建構函式生成臨時量,在呼叫賦值函式,最後再析構臨時量
8:注釋//7:呼叫隱式建構函式生成臨時量,再呼叫賦值函式,最後在析構臨時量
9:注釋//8:呼叫建構函式產生物件,因為有new沒有delete所以當前不析構
10:注釋//9:呼叫兩次建構函式產生兩個物件,因為有new沒有delete所以當前不析構
11:注釋//10:呼叫建構函式產生臨時物件,在呼叫賦值函式,最後再析構p3
12:注釋//11:呼叫建構函式構造p4
13:注釋//12:析構p1所指堆上的物件
14:注釋//13:呼叫兩次析構函式析構p2所指堆上的兩個物件
15:最後析構:p4,t4,t3,t2,t5,t1。
接下來我們看一下列印的結果:
**************************大家可以根據結果再仔細分析推敲**********************************
C 類的生存週期
眾所周知,類是c 的核心,而對於類的生存週期的長短是受到很多因素影響,在這裡我從以下幾個方面來分析 類在.data段生成時的生存週期 類在棧區生成時的生存週期 類在堆區生成時的生存週期 為了體現各種情況下類的生存週期,我們寫乙個測試用例來直觀地感受。class cgoods 實現三種構造方式 乙個拷...
C 中物件的生存週期
在c中有變數的生存週期,那麼在c 中就有物件的生存週期。1 普通物件的生存週期 若有乙個cobject類,屬性是姓名和年齡。cobject gobject1 int main cobject gobject2 函式呼叫的先後順序是 建構函式 gobject1 gobject2 object1 obj...
物件的生存週期
在學習析構函式時,了解到一般物件的銷毀是在main函式內return之後。在棧上構造的物件要符合棧的先進後出的規則。堆上new的物件需要遇到delete的時候才能銷毀,否則會出現記憶體洩漏。所以一般的物件生存週期為定義點開始,return之後main函式退出之前結束。對於特殊的物件,總結如下 1 全...