对于以下代码,为什么“A关闭:3”打印两次?
#include <stdio.h>
class A
{
public:
int a;
A(int n)
{
a = n;
printf("This is A: %d.\n", a);
}
A()
{
a = 0;
printf("This is A: %d.\n", a);
}
~A()
{
printf("A is closed: %d.\n", a);
}
};
class B
{
public:
A a;
B()
{
a = A(3);
}
};
void f()
{
B b;
}
int main()
{
f();
return 0;
}
输出:
This is A: 0.
This is A: 3.
A is closed: 3.
A is closed: 3.
答案 0 :(得分:2)
如果您希望它只打印一次,请允许我向您介绍initializer lists:
class B {
public:
A a;
B() : a(3) {
}
};
目前,在您的代码中,它打印两次,因为创建B时,构造了所有成员,然后然后调用B
的构造函数。打印一次以构建A a
,然后在将a
设置为A(3)
时再次打印。初始化列表允许您指定在构造函数运行之前应如何构造每个成员。
其他提示:成员初始化的顺序仅受其在struct / class中的出现顺序的影响,与初始化列表中的顺序无关。
答案 1 :(得分:0)
因为在b为a分配了 new 值之前,它已经有了一个值(一个实例存在)。 您正在使用默认赋值运算符,它只将临时A(3)实例的副本复制为B的成员,并且该副本现在必须被销毁。
当f返回它创建的B实例时,它被销毁并反过来破坏其成员a。