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

时间:2012-11-11 02:35:48

标签: 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.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编译了这段代码。

2 个答案:

答案 0 :(得分:2)

A();没有按照您的想法行事。

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

您所做的就是创建一个匿名的附加类型实例,然后将其丢弃。它对this没有影响,也不会按照您的想法行事。

初始化列表在C ++ 11中以您期望的方式工作。

答案 1 :(得分:0)

这完全与C ++ 11无关。

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

如果是'B';您尝试从initialzier列表初始化一个不存在的成员。您在A内没有A*A的实例进行初始化。