用C++编写堆栈对象 - 替代语法

Mik*_*ike 4 c++ syntax stack creation object

可能重复:
C++中的以下短语是什么意思:零,默认和值初始化?

我对C++中的一个问题感到困惑.

使用默认构造函数在堆栈上创建对象时,我认为以下两种语法符号之一会产生相同的结果:

class MyClass { public: int i; }
int main()
{
  MyClass a = MyClass();
  MyClass b;
}
Run Code Online (Sandbox Code Playgroud)

但是,第一个语法将字段初始化为零,而第二个语法将字段初始化为未初始化.所以我的问题是:

  1. 为什么会这样?我认为C++中的字段不应该自动初始化.
  2. 两种语法之间是否还有其他差异?
  3. 这些语法变体是否具有单独的名称以区分它们?

我目前正在使用Microsoft Visual C++ 2010 Express.谢谢!

ild*_*arn 7

在第一个中,您从值初始化的实例中复制初始化 .从C++ 03标准,§8.5/ 7:aMyClass

初始值为空集括号的对象,即(),应进行值初始化.

从§8.5/ 5开始:

值初始化类型的对象T意味着:

  • if T是具有用户声明的构造函数的类类型,然后T调用默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
  • 如果T是没有用户声明的构造函数的非联合类类型,则每个非静态数据成员和基类组件T都是值初始化的;
  • 如果T是数组类型,则每个元素都是值初始化的;
  • 否则,该对象被零初始化

零初始化的类型的对象T是指:

  • 如果T是标量类型,则将对象设置为0(零)转换为的值T;
  • 如果T是非联合类类型,则每个非静态数据成员和每个基类子对象都是零初始化的;
  • if T是一个联合类型,该对象的第一个命名数据成员)是零初始化的;
  • if T是数组类型,每个元素都是零初始化的;
  • 如果T是引用类型,则不执行初始化.

在第二种情况下,如果不是POD类型,则以b某种方式声明它将导致默认初始化 d MyClass- §8.5/ 5:

缺省初始化类型的对象T表示:

  • 如果T是非POD类类型,T则调用默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
  • 如果T是数组类型,则每个元素都是默认初始化的;
  • 否则,该对象被零初始化.

但是,因为MyClass是POD类型,b未初始化 - §8.5/ 9:

如果没有为对象指定初始化程序,并且该对象是(可能是cv限定的)非POD类类型(或其数组),则该对象应默认初始化; 如果对象是const限定类型,则底层类类型应具有用户声明的默认构造函数.否则,如果没有为非静态对象指定初始化程序,则该对象及其子对象(如果有)具有不确定的初始值 ; 如果对象或其任何子对象是const限定类型,则程序格式错误.