Mik*_*ike 4 c++ syntax stack creation object
我对C++中的一个问题感到困惑.
使用默认构造函数在堆栈上创建对象时,我认为以下两种语法符号之一会产生相同的结果:
class MyClass { public: int i; }
int main()
{
MyClass a = MyClass();
MyClass b;
}
Run Code Online (Sandbox Code Playgroud)
但是,第一个语法将字段初始化为零,而第二个语法将字段初始化为未初始化.所以我的问题是:
我目前正在使用Microsoft Visual C++ 2010 Express.谢谢!
在第一个中,您从值初始化的实例中复制初始化 .从C++ 03标准,§8.5/ 7:a
MyClass
初始值为空集括号的对象,即(),应进行值初始化.
从§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限定类型,则程序格式错误.
归档时间: |
|
查看次数: |
571 次 |
最近记录: |