C++ 从同一类中的另一个构造函数调用一个构造函数

C++ 从同一类中的另一个构造函数调用一个构造函数,c++,class,constructor,compiler-errors,C++,Class,Constructor,Compiler Errors,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.disp

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;
}
产出:10

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中编译了这些代码。

A()
没有做您认为它能做的事情

将其替换为
double()
char()或任何其他类型。请注意,它是有效的

您所做的只是创建一个该类型的匿名附加实例,然后将其丢弃。它不会影响
,也不会做您认为它会做的事情


初始值设定项列表在C++11中的工作方式与您预期的相同。

这与C++11完全无关

正如Yakk在第一种情况中指出的那样,您可以通过不同的构造函数(默认构造函数)非递归地构造匿名成员


在“B”情况下;您尝试从initialzier列表初始化一个不存在的成员。在
A
中没有要初始化的
A
A*
实例。

C++11允许像第二个示例中那样委托构造函数,而不是在主体内部调用它们。听起来好像是因为这个原因,你第一次想到了一个错误,所以我想确定这是清楚的。第二个克里斯在这里,你应该阅读C++的构造函数。参考:请再解释一点。我应该替换什么。以及为什么它对替换有效。我知道我违反了规则,但为什么这两种情况下的规则都不一样,因为两者都应该是错误的。在代码中只有一个地方有字符
a()对吗?这不是在做你认为它在做的事情。它正在创建一个不相关的临时类型A,然后丢弃它?这个函数怎么样:
voidfoo(){A();}
?这个函数如何
void bar(){A A=A();}