为什么对象默认初始化,但基元不在C ++中?

时间:2019-12-20 01:42:58

标签: c++ initialization

为什么原始类型没有默认初始化,但是对象使用C ++?例如:

class Foo {
  void Method() {
    int w(); // initialized to 0
    int x; // uninitialized
    std::vector<int> y(); // initialized to empty vector
    std::vector<int> z; // initialized to empty vector
  }
}

在这种情况下,wy用括号声明,因此被初始化,z被声明为没有,并没有调用其默认参数构造函数,但是{{ 1}}仍未初始化。为什么会这样?

2 个答案:

答案 0 :(得分:2)

如果没有对象的初始化程序,则该对象为默认初始化 [dcl.init]/12。如果初始化程序是(),则对象是值初始化的 [dcl.init]/11。类类型的对象(例如std::vector<int>)的默认初始化调用默认的构造函数,而类型为int的对象的默认初始化意味着没有初始化[dcl.init]/7。值初始化还会为具有1的类类型的对象调用默认构造函数(例如std::vector<int>),但是对于类型为int的对象,值初始化表示零初始化 { {3}}。 int的零初始化实际上确实意味着int被初始化为零[dcl.init]/8

评论中已经指出

int w();

std::vector<int> y();

实际上不是局部变量的定义,而是两个函数wy的声明,它们不带参数并分别返回intstd::vector<int> (臭名昭著的[dcl.init]/6)。不过,在某些情况下,可以将()用作实际的初始化程序,因此让我们对示例进行一些修改以演示您所询问的行为:

class Foo
{
    int w;
    std::vector<int> y;

    Foo()
      : w(),  // value initialized == zero initialized for int
        y()   // value initialized == default initialized for std::vector<int>
    {
        int x; // default initialized == uninitialized for int
        std::vector<int> z; // default initialized
    }
};

答案 1 :(得分:1)

这里的“为什么”简化为“因为C ++试图使C尽可能保持性能和行为兼容”。当您销售一种新的,相对较低级别的语言(至少在最初时)主要是C的超集时,您不想说“如果将现有的C代码编译为C ++,它总是会变慢!” C默认情况下不会对基元进行零初始化;只要代码最终在为其读取之前为其分配值,就可以了,C ++遵循相同的模式。