2

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

4

2 回答 2

2

A();没有做你认为它做的事情。

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

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

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

于 2012-11-11T02:56:21.120 回答
0

这与 C++11 完全无关。

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

如果是“B”;您尝试从 initialzier 列表中初始化一个不存在的成员。您没有要初始化的实例AA*现有实例。A

于 2013-08-27T20:52:09.857 回答