單個對象的構(gòu)造與析構(gòu)
- 單個對象創(chuàng)建時構(gòu)造函數(shù)的調(diào)用順序
- 1杀狡、調(diào)用父類的構(gòu)造過程
- 2、調(diào)用成員變量的構(gòu)造函數(shù)(調(diào)用順序與聲明順序相同)
- 3娜谊、調(diào)用類自身的構(gòu)造函數(shù)
- 析構(gòu)函數(shù)與對應(yīng)構(gòu)造函數(shù)的調(diào)用順序相反
- 多個對象析構(gòu)時
- 析構(gòu)順序與構(gòu)造順序相反
- 對于棧對象和全局對象涧至,類似于入棧與出棧的順序,最后構(gòu)造的對象被最先析構(gòu)
- 堆對象的析構(gòu)發(fā)生在使用delete的時候退个,與delete的使用順序相關(guān)
局部對象
- 對于局部對象
- 當(dāng)程序執(zhí)行流到達(dá)對象的定義語句時進(jìn)行構(gòu)造
舉個??:
int i = 0;
Test a1 = i;
while( i < 3 )
{
Test a2 = ++i;
}
if( i < 4 )
{
Test a = a1;
}
else
{
Test a(100);
}
在這段代碼里Test類構(gòu)造順序是按照程序的執(zhí)行流依次往下進(jìn)行募壕。
堆對象
- 對于堆對象
- 當(dāng)程序執(zhí)行流到達(dá)new語句時創(chuàng)建對象
- 使用new創(chuàng)建對象將自動觸發(fā)構(gòu)造函數(shù)的調(diào)用
再次舉??:
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
在這段代碼中只有執(zhí)行new時在堆空間分配空間后才執(zhí)行構(gòu)造方法。
全局對象
- 對于全局對象
- 對象的構(gòu)造順序是不確定的
- 不同的編譯器使用不同的規(guī)則確定構(gòu)造順序
最后舉一次??:
#include "test.h"
Test t4("t4");
int main()
{
Test t5("t5");
}
這里的Test是全局對象帜乞,那它的構(gòu)造順序就不確定司抱,依編譯器而定筐眷。