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();またはchar();または 他のタイプに置き換えます。動作することに注意してください。

あなたがしているのは、型の匿名の追加インスタンスを作成してから捨てることだけです。影響はなくthis、あなたが思っていることはしません。

初期化子リストは、C++11 で期待どおりに機能します。

于 2012-11-11T02:56:21.120 に答える
0

これは C++11 とはまったく関係ありません。

最初のケースで Yakk が指摘したように、別のコンストラクター (デフォルトのコンストラクター) を介して非再帰的に匿名メンバーを構築します。

「B」の場合。存在しないメンバーを initialzier リストから初期化しようとしました。A初期化する のインスタンスまたはA*既存の がありませんA

于 2013-08-27T20:52:09.857 に答える