// 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
实例的成员没有被零初始化(这正是我想要实现的)。我的理解是否正确,如果我定义了构造函数,它将不执行零初始化?
(我知道如何使用显式默认值实现初始化为零。问题在于我为什么无法使用init-list实现它)列表初始化
值初始化否则,如果花括号初始化列表为空,且T是具有默认构造函数的类类型,则执行值初始化。
聚合初始化(似乎这不是我的情况,因此它没有将成员初始化为零)在所有情况下,如果使用空括号对{}并且T是聚合类型,则执行聚合初始化,而不执行值初始化。
对于需要解决某些类成员在初始化之前被使用的遗留代码,最简单且最少出错的修改方式是什么?聚合体是以下类型之一:
- 没有用户声明的构造函数的类类型(通常是结构体或联合体)
T() = default;
进行初始化会更简单/更安全(而使用T t3;
则可能导致垃圾值或未定义行为),因此最好使用int x = 0; int y = 0;
进行初始化。 - Jarod42T
不是一个好的选择。它对类的功能一无所知,而且T
通常与模板类型参数相关联。 - Marek R