这是我的短代码
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
我的问题是:为什么?我试图重载我能想到的一切,这意味着:复制构造函数,构造函数有一个,两个参数,(昏迷,相等,[])运算符,但我不知道编译器生成什么,它可以采取2个整数一个构造函数并将它们分配给x,y。我甚至试图在括号{}中溢出数字,通过放置{99999999999999999999,3}来查看编译器会喊什么,但它说它因为溢出而无法转换const int,所以我认为它必须是转换,但是如何? / p>
答案 0 :(得分: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
。
第二个片段只会初始化第一个元素。
编辑:要澄清,请尝试以下测试:
int x[10] = {1,1,1};
这只会初始化数组的前3个元素。
此外,如果没有转换构造函数,请尝试以下操作:
A t[4] = {1,1,2,2};
将初始化前2 A
。