C++中構造和析構的順序


先說結論:

構造:

  • 基類成員對象的構造函數
  • 基類的構造函數
  • 子類成員對象的構造函數
  • 子類的構造函數

析構:

  • 子類的析構函數
  • 子類成員的析構函數
  • 基類的析構函數
  • 基類成員的析構函數

借一幅圖(https://blog.csdn.net/wq_1996/article/details/78219479

 

可見是剛好反過來的。 

// 驗證構造函數順序

#include<iostream>

class Mem{
public:
    Mem(int x)
    {
        std::cout << "mem constructor " << x << std::endl;
    }
};

class Base{
public:
    Base()
    {
        std::cout << "base constructor" << std::endl;
    }
    Mem* m = new Mem(1);
};

class Test : Base{
private:
    int x;
public:
    Test()
    {
        std::cout << "test constructor" << std::endl;
    }
    Mem* m = new Mem(2);
};

int main()
{
    Test* t = new Test();
}
View Code

// 驗證析構函數順序

#include<iostream>

class Mem{
public:
    ~Mem()
    {
        std::cout << "mem" << std::endl;
    };
};

class Base{
public:
    ~Base()
    {
        std::cout << "~base" << std::endl;
    };
    Mem m;
};

class Test:Base{
public:
    ~Test()
    {
        std::cout << "~test" << std::endl;
    };
    Mem m;
};

int main()
{
    Test t;
    t.~Test();
    getchar();
    return 0;
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM