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

我的问题是:为什么会这样?我试图重载我能想到的所有东西,这意味着:复制构造函数,带有一个,两个参数的构造函数,(coma,equality,[]) 运算符,但我不知道编译器生成什么可以接受 2 个整数一个构造函数并将它们分配给 x,y。我什至试图溢出括号{}中的数字,通过放置 {99999999999999999999,3} 来查看编译器会喊什么,但它说它不能转换 const int 因为溢出,所以我相信它必须是转换,但是如何?

4

1 回答 1

1

您正在隐式转换9, 和3to 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)};

由于注释掉了转换构造函数(让我们这么称呼它,虽然我不确定它是),它将不再能够转换intA.

第二个片段只会初始化第一个元素。

编辑:为了澄清,请尝试以下测试:

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

这只会初始化数组的前 3 个元素。

此外,如果没有转换构造函数,请尝试以下操作:

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

前 2A将被初始化。

于 2012-02-14T18:57:50.110 回答