#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构造函数。
为什么?
答案 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++?