1. 程式人生 > >物件的生存週期

物件的生存週期

  1. 一般物件的生存週期在函式內,生成時生成,呼叫解構函式時結束或者return之後。
  2. 一般臨時物件的結束是在該物件生成的語句分號前呼叫解構函式。
  3. 但是引用會提升臨時物件的生存週期,會將生存週期提升的與引用物件的生存週期相同。
  4. 指標並不能提升物件的生存週期,不能指向臨時物件,因為當該條語句分號結束之後會指向別處出現非法訪問。
  5. 全域性物件的生成在可執行檔案載入時,在main函式之後結束
  6. 區域性靜態生成的物件在data段,所以在呼叫處生成,生存於整個時期
  7. 如下範例程式碼:
#include<iostream>
using namespace std;
class Test
{
public:
	Test(int a = 5, int b = 5) :ma(a), mb(b)
	{
		cout <<this<< "Test(int, int)" << endl;
	}
	~Test()
	{
		cout << this << "~Test()" << endl;
	}
	Test(const Test &src) :ma(src.ma), mb(src.mb)
	{
		cout<<this << "Test(const Test&)" << endl;
	}
	void operator=(const Test &src)
	{
		ma = src.ma; mb = src.mb; 
		cout << this << "operator=" << endl;
	}
private:
	int ma;
	int mb;
};
Test t1(10, 10);
int main()
{
	Test t2(20, 20);
	Test t3 = t2;
	static Test t4 = Test(30, 30);
	t2 = Test(40, 40);
	t2 = (Test)(50, 50);
	t2 = 60;
	Test *p1 = new Test(70, 70);
	Test *p2 = new Test[2];
	Test *p3 = &Test(80, 80);
	Test &p4 = Test(90, 90);
	delete p1;
	delete[]p2;
}
Test t5(100, 100);

其執行結果如下:

從結果分析:

構造過程:1.t1呼叫建構函式;2.t5呼叫建構函式;3.t2呼叫建構函式;4.t3呼叫拷貝建構函式;5.為了生成新的物件而顯式生成臨時物件是以生成臨時物件的方式來生成新的物件,相當於只調用了建構函式生成t4;6.顯式生成的臨時物件並非為了生成新物件,呼叫建構函式,然後呼叫複製運算子過載函式,然後臨時物件析構;7.與6相同3個有函式的呼叫;8.與6相同有3個函式的呼叫;9.*p1指向一個新的物件呼叫一次建構函式;10.*p2有兩個新物件的生成;11.p3指向一個臨時物件的地址,所以在p3行程式碼中有一次構造一次析構的呼叫;12.p4延長臨時物件的生存週期至main函式的}之前所以有一次建構函式呼叫。

析構:deletep1析構p1指向的的兩個物件,delete處析構p2指向的的兩個物件,然後由於先構造的後析構,p4處的臨時物件析構,然後t3析構,t2析構,t4析構,t5析構,t1析構。