什么时候进行值初始化
- 当以空的括号或花括号 (C++11 起)对组成的初始化器创建无名临时对象时。
- 当 new 表达式以空的括号或花括号 (C++11 起)对组成的初始化器创建具有动态存储期的对象时
- 当以由空花括号对(不包括括号)组成的初始化器声明具名变量(自动、静态或线程局部)时。
值初始化的效果
- 如果类类型有用户定义的默认构造函数,则执行用户定义的默认构造函数,如果有合成的默认构造函数,则先进行零初始化后再执行合成的默认构造函数,这也是值初始化和默认初始化的区别,对于下面的TestClass1,如果执行默认初始化则在编译时会报未初始化错误。
- 数组则值初始化数组的每个元素。
- 内置类型则零初始化对象。
//隐式默认构造函数
class TestClass1
{
public:
int value1;
string value2;
};
//无默认构造函数
class TestClass2
{
public:
int value1;
std::string value2;
TestClass2(const TestClass2&) { }
};
//用户提供的默认构造函数
class TestClass3
{
public:
int value1;
std::string value2;
TestClass3() { }
};
int main()
{
cout << int{} << endl;//0
double f = double();
cout << f << endl;//0
int* a = new int[10](); //每个元素都是0
cout << a[1] << endl;//0
TestClass1 t1{};
cout << t1.value1<< endl;//0
cout << t1.value2 << endl;//空
// TestClass2 t2{};// 错误:类无默认构造函数
TestClass3 t3{};
cout << t3.value1 << endl;//随机值
cout << t3.value2 << endl;//空
system("pause");
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。