C++值初始化

什么时候进行值初始化

  • 当以空的括号或花括号 (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");
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容