1)第一个代码
class A
{
public:
int i;
int b;
A(int temp){
i=temp;
A();
b=0;
}
A(){
b=0;
}
void display(){
printf("%d %d\n",i,b);//1 0
}
};
int main(){
A Aobj(1);
Aobj.display();
return 0;
}
输出:1 0
2)第二代码
class A
{
public:
int i;
int b;
A(int temp) : i(temp), A(), b(0) {}//Error
A() : b(0) {}
void display(){
printf("%d %d\n",b,i);
}
};
int main()
{
A Aobj(1);
Aobj.display();
return 0;
}
我原以为这两个代码都会显示相同的行为并且会产生错误,因为不允许在同一个类中调用另一个构造函数。 这不是C ++ 11。
那么为什么使用初始化列表会有所作为呢? 我用g ++ 4.3.4编译了这段代码。
答案 0 :(得分:2)
A();
没有按照您的想法行事。
将其替换为double();
或char();
或任何其他类型。请注意它有效。
您所做的就是创建一个匿名的附加类型实例,然后将其丢弃。它对this
没有影响,也不会按照您的想法行事。
初始化列表在C ++ 11中以您期望的方式工作。
答案 1 :(得分:0)
这完全与C ++ 11无关。
正如Yakk在第一种情况中指出的那样,您通过不同的构造函数(默认构造函数)非递归地构造一个匿名成员。
如果是'B';您尝试从initialzier列表初始化一个不存在的成员。您在A
内没有A*
或A
的实例进行初始化。