-2

对于以下代码,为什么会打印两次“A is closed: 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.
4

2 回答 2

2

如果您希望它只打印一次,请允许我向您介绍初始化列表

class B {
    public:
        A a;

        B() : a(3) {
        }
};

目前,在您的代码中,它会打印两次,因为在创建 B 时,会构造其所有成员,然后B调用of 的构造函数。构建时打印一次A a,然后设置为时再次a打印A(3)。初始值设定项列表允许您指定在构造函数运行之前应该如何构造每个成员。

附加提示:成员的初始化顺序仅受它们在结构/类中出现的顺序影响,与它们在初始化列表中的顺序无关。

于 2013-07-10T00:38:05.023 回答
0

因为在 b 为 a 分配值之前,它已经有一个值(存在一个实例)。您正在使用默认赋值运算符,它只是将临时 A(3) 实例的副本复制到 B 的成员 a 中,并且该副本现在必须被销毁。

当 f 返回它创建的 B 实例时,它会被销毁并反过来销毁其成员 a。

于 2013-07-10T00:38:20.843 回答