單個對象的構造與析構
- 單個對象創建時構造函數的調用順序
- 1、調用父類的構造過程
- 2、調用成員變量的構造函數(調用順序與聲明順序相同)
- 3、調用類自身的構造函數
- 析構函數與對應構造函數的調用順序相反
- 多個對象析構時
- 析構順序與構造順序相反
- 對于棧對象和全局對象,類似于入棧與出棧的順序,最后構造的對象被最先析構
- 堆對象的析構發生在使用delete的時候,與delete的使用順序相關
局部對象
- 對于局部對象
- 當程序執行流到達對象的定義語句時進行構造
舉個??:
int i = 0;
Test a1 = i;
while( i < 3 )
{
Test a2 = ++i;
}
if( i < 4 )
{
Test a = a1;
}
else
{
Test a(100);
}
在這段代碼里Test類構造順序是按照程序的執行流依次往下進行。
堆對象
- 對于堆對象
- 當程序執行流到達new語句時創建對象
- 使用new創建對象將自動觸發構造函數的調用
再次舉??:
int i = 0;
Test* a1 = new Test(i); // Test(int i): 0
while( ++i < 10 )
if( i % 2 )
new Test(i); // Test(int i): 1, 3, 5, 7, 9
if( i < 4 )
new Test(*a1);
else
new Test(100); // Test(int i): 100
在這段代碼中只有執行new時在堆空間分配空間后才執行構造方法。
全局對象
- 對于全局對象
- 對象的構造順序是不確定的
- 不同的編譯器使用不同的規則確定構造順序
最后舉一次??:
#include "test.h"
Test t4("t4");
int main()
{
Test t5("t5");
}
這里的Test是全局對象,那它的構造順序就不確定,依編譯器而定。