C++中對象構造順序

單個對象的構造與析構


  • 單個對象創建時構造函數的調用順序
    • 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是全局對象,那它的構造順序就不確定,依編譯器而定。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容