C++构造函数和析构函数的具体执行算法

C++构造函数和析构函数的具体执行算法,第1张

构造函数:
  1. 在派⽣类构造函数中,所有的虚基类及上⼀层基类的构造函数调⽤;
  2. 对象的 vptr 被初始化;
  3. 如果有成员初始化列表,将在构造函数体内扩展开来,这必须在 vptr 被设定之后才做;
  4. 执⾏程序员所提供的代码;
而当被扩展的类的构造函数:
  1. 记录在成员初始化列表中的数据成员初始化 *** 作会被放在构造函数的函数体内,并与成员的声明顺序为顺序;
  2. 如果⼀个成员并没有出现在成员初始化列表中,但它有⼀个默认构造函数,那么默认构造函数必须被调⽤;
  3. 如果 class 有虚表,那么它必须被设定初值;
  4. 所有上⼀层的基类构造函数必须被调⽤;
  5. 所有虚基类的构造函数必须被调⽤
析构函数:

  1. 析构函数函数体被执⾏;
  2. 如果 class 拥有成员类对象,⽽后者拥有析构函数,那么它们会以其声明顺序的相反顺序被调⽤;
  3. 如果对象有⼀个 vptr,现在被重新定义
  4. 如果有任何直接的上⼀层⾮虚基类拥有析构函数,则它们会以声明顺序被调⽤;
  5. 如果任何虚基类拥有析构函数

例子:

#include 

using namespace std;

class OBJ1
{
public:
    OBJ1(){ cout <<"OBJ1\n"; }
};

class OBJ2
{
public:
    OBJ2(){ cout <<"OBJ2\n"; }
};

class Base1
{
public:
    Base1(){ cout <<"Base1\n"; }
};

class Base2
{
public:
    Base2(){ cout <<"Base2\n"; }
};

class Base3
{
public:
    Base3(){ cout <<"Base3\n"; }
};

class Base4
{
public:
    Base4(){ cout <<"Base4\n"; }
};

class Derived :public Base1, virtual public Base2,
    public Base3, virtual public Base4
{
public:
    Derived() :Base4(), Base3(), Base2(),
        Base1(), obj2(), obj1()
    {
        cout <<"Derived ok.\n";
    }
protected:
    OBJ1 obj1;
    OBJ2 obj2;
};

int main()
{
    Derived aa;
    cout <<"This is ok.\n";

    int i;
    cin >> i;

    return 0;
}

结果: 

Base2
Base4
Base1
Base3
OBJ1
OBJ2
Derived ok.
This is ok.

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/872761.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存