原因
进入类的构造函数之前,编译器会要求类的成员变量已经完成了初始化。
如果成员变量是自定义的数据类型,那这个时候就会先调用了一次类的构造函数,然后之后在构造函数中又调用了一次构造函数。
实验说明
实验一
这里可以看到编译器的报错,也就是说明,在进入构造函数前,要求成员变量有自己的默认构造函数
class test {
public:
int x;
test(){};
test(int x) {
this->x = x;
}
};
class base {
test T;
public:
base():{
T.x = 5;
}
};
void main() {
base b;
}
实验二
可以看到,加入初始化列表之后,错误消失。
说明现在是调用了一次构造函数。
class test {
public:
int x;
test(int x) {
this->x = x;
}
};
class base {
test T;
public:
base():T(0) {
T.x = 5;
}
};
void main() {
base b;
}