// Example program
#include <iostream>
#include <string>
class T{
public:
int x, y;
T(){
std::cout << "T() constr called..." << std::endl;
};
T(int x, int y):x(x),y(y){
std::cout << "T(x,y) constr called..." << std::endl;
}
void inspect(){
std::cout << "T.x: " << this->x << std::endl;
std::cout << "T.y: " << this->y << std::endl;
}
};
int main()
{
T t1(5,6);
t1.inspect();
std::cout << std::endl;
T t2 = {};
t2.inspect();
}
我得到以下结果:
T(x,y) constr called...
T.x: 5
T.y: 6
T() constr called...
T.x: 208787120
T.y: 31385
实例的成员t2
不是零初始化的(我想要实现的)。我是否理解正确,如果我定义了一个构造函数,它不会执行零初始化?(我知道如何使用显式默认值实现初始化为零。问题是为什么我不能使用初始化列表来做到这一点)
列表初始化
否则,如果括号初始化列表为空并且 T 是具有默认构造函数的类类型,则执行值初始化。
值初始化
在所有情况下,如果使用空的大括号 {} 对并且 T 是聚合类型,则执行聚合初始化而不是值初始化。
聚合初始化(似乎这不是我的情况,因此它没有将成员初始化为零)
聚合是以下类型之一:
- 类类型(通常是结构或联合),具有
- 没有用户声明的构造函数
什么是遗留代码的最简单且不易出错的修改,我需要解决在初始化之前使用某些类成员的问题?