引用自C++ Primer, 4th, 第5.11节 new和delete表达式
如果不提供显式初始化,动态创建的对象与在函数内定义的变量初始化方式相同(第 2
.3.4 节)。对于类类型的对象,用该类的默认构造函数初始化;而内置类型的对象则无
初始化。
string *ps = new string; // initialized to empty string
int *pi = new int; // pi points to an uninitialized int
同样也可对动态创建的对象做值初始化(value-initialize)(第 3.3.1 节):
string *ps = new string(); // initialized to empty string
int *pi = new int(); // pi points to an int value-initialized to 0
cls *pc = new cls(); // pc points to a value-initialized object of typ
e cls
以上表明程序员想通过在类型名后面使用一对内容为空的圆括号对动态创建的对象做值
初始化。内容为空的圆括号表示虽然要做初始化,但实际上并未提供特定的初值。对于
提供了默认构造函数的类类型(例如 string),没有必要对其对象进行值初始化:无论
程序是明确地不初始化还是要求进行值初始化,都会自动调用其默认构造函数初始化该
对象。而对于内置类型或没有定义默认构造函数的类型,采用不同初始化方式则有显著
的差别:
int *pi = new int; // pi points to an uninitialized int
int *pi = new int(); // pi points to an int value-initialized to
0
第一个语句的 int 型变量没有初始化,而第二个语句的 int 型变量则被初始化为0。