C ++中的构造函数执行顺序

时间:2011-06-15 23:06:44

标签: c++ constructor

#include <cstdio>

struct A {
  int a;
  A() {
    a = 2;
    printf("Default\n");
  }
  A(int b_) {
    a = 1;
    if(b_ == 10) {
      A();
    }
  }
};

int main(int argc, char **argv) {
  A a(10);
  printf("a=%d\n", a.a);
  A b(11);
  printf("b=%d\n", b.a);
  return 0;
}

打印:

Default
a=1
b=1

也就是说,它在b_ == 10时进入Default构造函数,但在不是时则进入。但它不会改变a.a中的值,即使它进入Default构造函数。

为什么?

6 个答案:

答案 0 :(得分:6)

您没有调用构造函数。你只是创建一个临时的A然后立即销毁它。您不能从当前标准(C ++ 03)中的构造函数调用其他构造函数,甚至在C ++ 0x中,您只能从初始化列表中调用其他构造函数。

答案 1 :(得分:4)

到目前为止,大多数答案都表示你没有调用构造函数。您正在看到构造函数调用的输出。因此,请忽略那些过度简化否定现实的答案。


代码段

if(b_ == 10) {
  A();
}

创建并销毁类A的临时对象。

作为创建的一部分,调用A默认构造函数来初始化对象。


C ++ 98规则旨在确保除非您使用非常低级别的功能强加相反的意愿,否则T类型对象的每次创建都只对应一个T构造函数调用在那个对象上。反之亦然,如果您调用T构造函数(这是上述代码的另一个有效视图),那么在C ++ 98中,您将创建一个T对象。您可以调用C ++ 构造函数调用保证:creation =构造函数调用。

构造函数调用保证意味着构造函数调用失败是对象创建失败:如果构造函数失败,那么您没有对象。

这简化了很多事情。

例如,它表示如果执行new A,并且A默认构造函数失败,则表示您没有对象。因此,分配用于保存该对象的内存将自动释放。因此,即使对象构造失败,表达式也不会泄漏内存 - 而不是对象,只会出现异常。

它几乎是美丽的。 : - )

答案 2 :(得分:2)

A();没有按照您的想法行事。 (例如,调用默认构造函数)

它会创建一个临时对象,然后将其丢弃。

答案 3 :(得分:1)

A();创建一个A的新(临时)实例,调用其默认构造函数。

你不能从构造函数中调用另一个构造函数。


如果要进行大量初始化,可以创建一个私有方法并在两个构造函数中调用它。

答案 4 :(得分:1)

在此代码中:

if(b_ == 10) {
  A();
}

你在堆栈上放了一个临时的A(),没有调用A的默认构造函数。

要执行您想要的操作,您需要将默认构造函数中的代码分解为辅助函数,然后从此处调用该函数和默认构造函数。

答案 5 :(得分:0)

使用A()(在A(int b)中),您将创建一个新的不同对象。

Googlr说:Can I call a constructor from another constructor (do constructor chaining) in C++?