匿名变量,通过引用传递,初始化列表

时间:2013-01-16 02:51:32

标签: c++ initialization pass-by-reference anonymous-types

所以我只是陷入了一些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个析构函数。感谢。

2 个答案:

答案 0 :(得分:4)

您没有覆盖A的复制构造函数来打印邮件......

具体来说,a(in)会调用它。

答案 1 :(得分:3)

缺少的构造函数将是A的复制构造函数。

您在下面的行中复制构造A.

B(const A& in) : a(in)  

A: destroyed
END

这是临时销毁,它在行尾被销毁

B b(A(0));