C++中对象的构造顺序和析构顺序
生活随笔
收集整理的這篇文章主要介紹了
C++中对象的构造顺序和析构顺序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1 C++中單個對象的構造和析構順序
- 1.1 單個對象的構造和析構順序
- 2 C++中多個對象的構造和析構順序
- 2.1 局部對象的構造順序
- 2.2 堆對象的構造順序
- 2.3 全局對象的構造順序
1 C++中單個對象的構造和析構順序
1.1 單個對象的構造和析構順序
單個對象創建時構造函數的調用順序:
析構函數與對應構造函數的調用順序相反。
2 C++中多個對象的構造和析構順序
C++中的類可以定義多個對象,那么對象構造的順序是怎樣的?
多個對象析構時,析構順序與構造順序相反。
對于析構總結如下:
- 對于棧對象和全局對象,類似于入棧與出棧的順序,最后構造的對象最先被析構。
- 堆對象的析構發生在使用delete的時候,與delete的使用順序相關。
2.1 局部對象的構造順序
對于局部對象:
- 當程序執行流到達對象的定義語句時進行構造。
如果使用了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創建對象將自動觸發構造函數的調用。
2.3 全局對象的構造順序
對于全局對象:
- 對象的構造順序是不確定的。
- 不同的編譯器使用不同的規則確定構造順序。
test.h:
#ifndef _TEST_H_ #define _TEST_H_#include <stdio.h>class Test { public:Test(const char* s){printf("%s\n", s);} };#endift1.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++中成员函数和成员变量的隶属问题