例如,如果我有一堂课:
class Info
{
int x;
int y;
};
我曾经创建过一个对象,
Info *p = new Info();
信息旁边的括号是否意味着我正在初始化它?与此有何不同,Info *p = new Info;
?
我知道有一个问题可以区分新旧 C++ 语言中的不同含义,但我想知道默认值初始化和值初始化之间的语义差异,例如值初始化是否意味着将某些东西初始化为零?
例如,如果我有一堂课:
class Info
{
int x;
int y;
};
我曾经创建过一个对象,
Info *p = new Info();
信息旁边的括号是否意味着我正在初始化它?与此有何不同,Info *p = new Info;
?
我知道有一个问题可以区分新旧 C++ 语言中的不同含义,但我想知道默认值初始化和值初始化之间的语义差异,例如值初始化是否意味着将某些东西初始化为零?
声明的变量可以是零初始化、值初始化或默认初始化。
在您的示例中:
Info *p = new Info(); <------- Value Initialization
Info *p = new Info; <------- Default Initialization
C++03 标准 8.5/5 恰当地定义了每个:
对T 类型的对象进行零初始化意味着:
— 如果 T 是标量类型(3.9),则将对象设置为转换为 T 的值 0(零);
— 如果 T 是非联合类类型,则每个非静态数据成员和每个基类子对象
都初始化为零;
— 如果 T 是联合类型,则对象的第一个命名数据成员为零初始化;
— 如果 T 是数组类型,则每个元素都初始化为零;
— 如果 T 是引用类型,则不执行初始化。
默认初始化T类型的对象意味着:
— 如果 T 是非 POD 类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是非良构的);
— 如果 T 是数组类型,则每个元素都是默认初始化的;
— 否则,对象被零初始化。
对T 类型的对象进行值初始化意味着:
— 如果 T 是具有用户声明的构造函数(12.1)的类类型(第 9 条),则调用 T 的默认构造函数(如果 T没有可访问的默认构造函数);
— 如果 T 是没有用户声明的构造函数的非联合类类型,则 T 的每个非静态数据成员和基类组件都是值初始化的;
— 如果 T 是一个数组类型,那么每个元素都是值初始化的;
— 否则,对象被零初始化