日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++中对象的构造顺序和析构顺序

發布時間:2025/4/5 c/c++ 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中对象的构造顺序和析构顺序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 C++中單個對象的構造和析構順序
      • 1.1 單個對象的構造和析構順序
      • 2 C++中多個對象的構造和析構順序
      • 2.1 局部對象的構造順序
      • 2.2 堆對象的構造順序
      • 2.3 全局對象的構造順序

1 C++中單個對象的構造和析構順序

1.1 單個對象的構造和析構順序

單個對象創建時構造函數的調用順序:

  • 調用父類的構造函數。
  • 調用成員變量的構造函數(調用順序與聲明順序相同)。
  • 調用自身的構造函數。
  • 析構函數與對應構造函數的調用順序相反。


    2 C++中多個對象的構造和析構順序

    C++中的類可以定義多個對象,那么對象構造的順序是怎樣的?

    多個對象析構時,析構順序與構造順序相反。

    對于析構總結如下:

    • 對于棧對象和全局對象,類似于入棧與出棧的順序,最后構造的對象最先被析構。
    • 堆對象的析構發生在使用delete的時候,與delete的使用順序相關。

    2.1 局部對象的構造順序

    對于局部對象:

    • 當程序執行流到達對象的定義語句時進行構造。
    #include <stdio.h>class Test { private:int mi; public:Test(int i){mi = i;printf("Test(int i): %d\n", mi);}Test(const Test& obj){mi = obj.mi;printf("Test(const Test& obj): %d\n", mi);} };int main() {int i = 0;Test a1 = i; // Test(int i): 0while( i < 3 ){Test a2 = ++i; // Test(int i): 1, 2, 3}if( i < 4 ){Test a = a1; // Test(const Test& obj): 0}else{Test a(100);}return 0; }

    如果使用了goto跳過了對象的構造,則可能帶來意想不到的后果:

    #include <stdio.h>class Test { private:int mi; public:Test(int i){mi = i;printf("Test(int i): %d\n", mi);}Test(const Test& obj){mi = obj.mi;printf("Test(const Test& obj): %d\n", mi);}int getMi(){return mi;} };int main() {int i = 0;Test a1 = i; // Test(int i): 0while( i < 3 ){Test a2 = ++i; // Test(int i): 1, 2, 3} goto End; Test a(100); End:printf("a.mi = %d\n", a.getMi()); // g++中編譯錯誤,vs中編譯通過,由于跳過了對象的構造,mi的值為隨機值return 0; }

    2.2 堆對象的構造順序

    對于堆對象:

    • 當程序執行流到達new語句時創建對象。
    • 使用new創建對象將自動觸發構造函數的調用。
    #include <stdio.h>class Test { private:int mi; public:Test(int i){mi = i;printf("Test(int i): %d\n", mi);}Test(const Test& obj){mi = obj.mi;printf("Test(const Test& obj): %d\n", mi);}int getMi(){return mi;} };int main() {int i = 0;Test* a1 = new Test(i); // Test(int i): 0while( ++i < 10 )if( i % 2 )new Test(i); // Test(int i): 1, 3, 5, 7, 9if( i < 4 )new Test(*a1);elsenew Test(100); // Test(int i): 100return 0; }

    2.3 全局對象的構造順序

    對于全局對象:

    • 對象的構造順序是不確定的。
    • 不同的編譯器使用不同的規則確定構造順序。

    test.h:

    #ifndef _TEST_H_ #define _TEST_H_#include <stdio.h>class Test { public:Test(const char* s){printf("%s\n", s);} };#endif

    t1.cpp:

    #include "test.h"Test t1("t1");

    t2.cpp:

    #include "test.h"Test t2("t2");

    t3.cpp:

    #include "test.h"Test t3("t3");

    main.cpp:

    #include "test.h"Test t4("t4");int main() {Test t5("t5"); }

    對于如上代碼不同編譯所對應的全局對象的構造順序是不同的。


    參考資料:

  • C++深度解析教程
  • 總結

    以上是生活随笔為你收集整理的C++中对象的构造顺序和析构顺序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。