对于基础类型(比如 int、double 等):
int* p = new int [5];
如果后面不加 “()”,则生成的数组不会初始化
int* p = new int [5] ();
如果后面加了 “()”,则会将 所有 数组元素初始化为类型 默认值
注意:
1. 数组 只能初始化为默认值,所以如果括号里面写0,也是一样的效果:
int* p = new int [5] (0);
这个跟上面的写法一样
但如果括号里面写成非默认值,则是不允许的,会报错:
int* p = new int [5] (3);
这种初始化方法是非法的
2. 但如果只是new单个变量的话,那么初始化为非默认值则是允许的:
int* p = new int (3);
这种写法是合法的
对于 class 类型:
不管后面加不加 "()",都会调用 class 的 构造函数 进行初始化
myClass* p = new myClass [5];
后面加不加 "()",都会 逐个元素 调用构造函数
C++11的初始化列表:
那么对于new出来的基础类型数组,想要初始化成非默认值怎么办呢?从C++11开始,提供了一种新方法叫初始化列表:
int* p = new int [5] { 1, 2, 3, 4, 5 };
用大括号表示的初始化列表可以将数组每一个元素初始化为任意值
int* p = new int [5] { 1, 2, 3 };
如果初始化列表小于元素数目,则只会初始化前面几个元素,后面的填上默认值;
int* p = new int [5] { 3 };
注意:如果列表中只有一个数,则只会初始化数组第一个元素,而不是全体初始化为3;
int* p = new int [5] { };
如果初始化列表为空,则全部初始化为默认值,此时效果与小括号初始化法等同。