1

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

4

2 回答 2

4

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

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

于 2013-01-16T02:53:06.840 回答
3

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

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

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

A: destroyed
END

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

B b(A(0));
于 2013-01-16T02:53:11.740 回答