1

これは私のショートコードです

class A {
public:
    int x,y;
    A(int a=0, int b=0) {
        x=a;y=b;
    }
};
int main() {
    A t[2] = {9,3};
    cout << t[0].x << " " << t[0].y << endl;
    cout << t[1].x << " " << t[1].y << endl;
}

出力は次のとおりです。

9 0
3 0

コンストラクターにコメントすると:

9 3
0 0

私の質問は次のとおりです。なぜですか?つまり、コピー コンストラクター、1 つ、2 つのパラメーターを持つコンストラクター、(coma、equality、[]) 演算子ですが、2 つの整数を受け取ることができるコンパイラが生成するものはわかりません。 1 つのコンストラクターを作成し、それらを x,y に割り当てます。{99999999999999999999,3} を入れて、どのコンパイラが叫ぶかを確認することで、括弧内の数値をオーバーフローさせようとしましたが、オーバーフローのために const int を変換できないと表示されているので、変換である必要があると思いますが、どのように?

4

1 に答える 1

1

9とを暗黙的に に変換し3ていAます。

小さなテストでこれが証明されます:

class A {
public:
    int x,y;
    explicit A(int a=0, int b=0) {
        x=a;y=b;
    }
};

これにより、コンパイル エラーが発生します。

つまり、コードは次のように変換されます。

A t[2] = {A(9),A(3)};

変換コンストラクターをコメントアウトしてから (そうかどうかはわかりませんが、そう呼びましょう)、 に変換できなくなりintますA

2 番目のスニペットは、最初の要素のみを初期化します。

編集:明確にするために、次のテストを試してください。

int x[10] = {1,1,1};

これは、配列の最初の 3 つの要素のみを初期化します。

また、変換コンストラクターがない場合は、次のことを試してください。

A t[4] = {1,1,2,2};

最初の 2Aが初期化されます。

于 2012-02-14T18:57:50.110 に答える