如果'Test'是一个普通的类,那么之间有什么区别:
Test* test = new Test;
Run Code Online (Sandbox Code Playgroud)
和
Test* test = new Test();
Run Code Online (Sandbox Code Playgroud) 以下短语在C++中的含义是什么:
零初始化,
默认初始化,和
值初始化
C++开发人员应该了解他们什么?
C++ 2003 8.5/5说:
到缺省初始化类型的对象T表示:
- 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
- 如果T是数组类型,则每个元素都是默认初始化的;
- 否则,对象被零初始化.
[重点补充.]
C++ 2011标准将最后一项更改为
- 否则,不执行初始化.
对于某些程序来说,这似乎是一个突破性的变化.这是故意的吗?
编辑
以下是一些激励这个问题的代码:
class Foo {
public:
Foo() : m_values() {}
int m_values[3];
};
Run Code Online (Sandbox Code Playgroud)
在C++ 11之前,我认为m_values在默认构造函数中明确提到将默认初始化该数组.由于数组的元素是标量,我预计这意味着值都被设置为0.
在C++ 11中,似乎不再保证会发生这种情况.但也许正如Mooing Duck在评论中指出的那样,也许这不再是默认初始化的情况,而是一些保留预期行为的其他形式.引文欢迎.
如果我有一个班级,例如:
class Info
{
int x;
int y;
};
Run Code Online (Sandbox Code Playgroud)
我曾经创建过一个对象,
Info *p = new Info();
Run Code Online (Sandbox Code Playgroud)
Info旁边的括号是否意味着我正在初始化它?它与此Info *p = new Info;有何不同?
我知道有一个问题可以区分新旧C++语言中的不同含义,但我想知道默认值和值初始化之间的语义差异,例如,值初始化是否意味着将某些内容初始化为零?