所以我只是陷入了一些C ++的麻烦之中。具体来说,通过引用传递匿名变量,以便在C ++中的类的初始化列表中使用。请考虑以下代码;
class A {
public:
int x;
A(int x=0) : x(x) {
std::cout <<"A: creatred\n";
}
~A() {
std::cout << "A: destroyed\n";
}
};
class B {
public:
A a;
B(const A& in) : a(in) {
std::cout <<"B: creatred\n";
}
~B() {
std::cout << "B: destroyed\n";
}
};
int main() {
B b(A(0));
std::cout << "END\n";
return 0;
}
输出:
A: creatred
B: creatred
A: destroyed
END
B: destroyed
A: destroyed
我计算了2个创作和3个破坏。这是怎么回事?我看到它的方式,我在创建A(0)
时使用匿名变量b
作为输入。不确定现在的顺序是什么。创建对匿名变量的引用并用于复制(复制构造函数将在初始化列表中调用,是吗?)成员变量a
。什么时候匿名变量被破坏了?总的来说,为什么我会看到2个构造函数和3个析构函数。感谢。
答案 0 :(得分:4)
您没有覆盖A
的复制构造函数来打印邮件......
具体来说,a(in)
会调用它。
答案 1 :(得分:3)
缺少的构造函数将是A的复制构造函数。
您在下面的行中复制构造A.
B(const A& in) : a(in)
A: destroyed
END
这是临时销毁,它在行尾被销毁
B b(A(0));