c++ 通过初始值设定项列表初始化基类类型成员变量时构造函数和析构函数的顺序

polhcujo  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(170)

当我在写一些关于基类/派生类类型变量的代码时,我遇到了这个有点奇怪的情况。它是这样的:

#include <iostream>

using namespace std;

class A {
public:
    A() { cout << "A Con" << endl; }
    virtual ~A() { cout << "A Dec" << endl; }
};
class B : A {
public:
    A a;
    B(A _a) : a(_a) { 
        cout << "B Con" << endl;
    }
    virtual ~B() { cout << "B Dec" << endl; }    
};

int main()
{
    A a;
    B b(a);
}

我在派生类(B)中声明了基类(A)类型成员变量,然后上面的代码给了我这个结果:

好的,那么第一个构造函数和最后一个构造函数是针对主函数中的a的,但是其他的呢?为什么析构函数被调用了5次而构造函数只被调用了3次?
我的猜测是:

A Con -> a in main()
A Con -> b in main() (base class constructor)
B Con -> b in main() (derived class constructor)
A Dec -> temporary value passed in B(A _a) : a(_a), copy constructor is called...
B Dec -> b in main() (derived class destructor)
A Dec -> member variable in B class (A a;)
A Dec -> b in main() (base class destuctor)
A Dec -> a in main()

我说的对不对?

pjngdqdw

pjngdqdw1#

这一点:

B(A _a) : a(_a) { 
    cout << "B Con" << endl;
}

调用A的复制构造函数,你还没有定义它,它不打印任何东西。

A(A const&) { cout << "A Con (Copy)" << endl; }

当您使用它时,您可能还需要A(A&&)A& operator=(A const&)A& operator=(A&&)

相关问题