單個(gè)對(duì)象的構(gòu)造與析構(gòu)
- 單個(gè)對(duì)象創(chuàng)建時(shí)構(gòu)造函數(shù)的調(diào)用順序
- 1、調(diào)用父類的構(gòu)造過(guò)程
- 2、調(diào)用成員變量的構(gòu)造函數(shù)(調(diào)用順序與聲明順序相同)
- 3、調(diào)用類自身的構(gòu)造函數(shù)
- 析構(gòu)函數(shù)與對(duì)應(yīng)構(gòu)造函數(shù)的調(diào)用順序相反
- 多個(gè)對(duì)象析構(gòu)時(shí)
- 析構(gòu)順序與構(gòu)造順序相反
- 對(duì)于棧對(duì)象和全局對(duì)象,類似于入棧與出棧的順序,最后構(gòu)造的對(duì)象被最先析構(gòu)
- 堆對(duì)象的析構(gòu)發(fā)生在使用delete的時(shí)候,與delete的使用順序相關(guān)
局部對(duì)象
- 對(duì)于局部對(duì)象
- 當(dāng)程序執(zhí)行流到達(dá)對(duì)象的定義語(yǔ)句時(shí)進(jìn)行構(gòu)造
舉個(gè)??:
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)行。
堆對(duì)象
- 對(duì)于堆對(duì)象
- 當(dāng)程序執(zhí)行流到達(dá)new語(yǔ)句時(shí)創(chuàng)建對(duì)象
- 使用new創(chuàng)建對(duì)象將自動(dò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時(shí)在堆空間分配空間后才執(zhí)行構(gòu)造方法。
全局對(duì)象
- 對(duì)于全局對(duì)象
- 對(duì)象的構(gòu)造順序是不確定的
- 不同的編譯器使用不同的規(guī)則確定構(gòu)造順序
最后舉一次??:
#include "test.h"
Test t4("t4");
int main()
{
Test t5("t5");
}
這里的Test是全局對(duì)象,那它的構(gòu)造順序就不確定,依編譯器而定。