具有包含其他对象的类的对象创建顺序
Object creation order with class having containment of other objects
#include "iostream"
using namespace std;
class C
{
public:
C() { cout << "C's Constructor Called " << endl; }
};
class A
{
public:
A() { cout << "A's Constructor Called " << endl; }
A(int) { cout << "A's int Constructor Called " << endl; }
};
class B
{
public:
A a;
B() { cout << "B's Constructor Called " << endl; }
B(int i) : a(i) { cout << "B's int Constructor Called " << endl; }
C c;
};
int main()
{
B b1(1);
return 0;
}
输出:
A的int构造函数被调用
C的构造函数被调用
问题:
为什么输出不包含"A的构造函数Called">
据我所说,我认为输出如下:
A的构造函数Called
C的构造函数Called
B的int构造函数Called
想知道为什么由于(i(,A A不会导致调用构造函数A((,而只调用A(int(
C++总是只调用一个类的一个构造函数。
在您的情况下,编译器选择A(int)
构造函数(因为这是您在B
中使用的构造函数(,因此从不调用任何其他构造函数。
想知道为什么A A不会导致调用构造函数A((,而只会因为(i(而导致调用A(int(
A a;
只是class B
的字段成员的声明。这不会像本地声明那样初始化变量。相反,在执行a(i)
时,初始化发生在B()
构造函数中。这将调用A(int)
构造函数。这里永远不会调用无参数构造函数。
A的构造函数未被调用,因为它被初始化列表中的参数化构造函数覆盖——B(int i(:A(i(。
如果你仔细观察"B的构造函数调用"也没有打印,因为同样的原因。
这只是因为您已经通过A的构造函数初始化了B的构造函数初始化器列表中的一个整数。
B(int i) : a(i) { cout << "B's int Constructor Called " << endl; }
你可以得到"调用了A的构造函数",如果你调用了它或没有初始化它,那么它就是默认初始化的:
B(int i) : a() { cout << "B's int Constructor Called " << endl; } // a is value-initialized which is here the same as default-initialized.
相关文章:
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 具有包含其他对象的类的对象创建顺序
- 为什么我们再次从结构对象创建结构变量?
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 如何创建一个对象创建函数,该函数将由与其关联的名称调用?
- 如何为自定义模板对象创建专门的函数模板
- 对象创建错误的C++矢量
- 如何为Python Swigged C++对象创建和分配回调函数
- 在 C++ 中为 C 样式对象创建一个透明包装类
- 此类模板的对象创建如何工作?
- C++ 中的对象创建类型有什么区别?
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 如何仅通过父类对象限制对象创建
- 在正确性或良好的代码结构方面,这种动态对象创建看起来如何
- 无法将类对象创建为另一个类的成员
- 如何从现有基类对象创建派生类对象
- 在 DTor 之前删除的静态对象创建的线程?
- C++:定义多个构造函数时的对象创建/销毁序列
- 从对象创建矢量包装器,该对象只允许使用索引访问向量
- 是否可以为CPP中的对象创建一组指针