C ++析构函数是如何执行的?

时间:2013-07-10 00:30:33

标签: c++ constructor destructor

对于以下代码,为什么“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.

2 个答案:

答案 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。