C++ 中,下面描述正确的是
int *p1 = new int[10]; int *p2 = new int[10]();
new运算符只是申请分配一个内存空间而已,因为不知道为其分配对象的名称,所以分配之后返回的只是一个指向该对象的指针,并没有初始化,加上一个()后,就相当于调用了默认构造函数,会默认初始化,用0来初始化
http://blog.csdn.net/xiajun07061225/article/details/8796257
int *pi = new int; // pi指向一个动态分配的,未初始化的无名对象
int *pia = new int[10]; // 10个未初始化int int *pia2 = new int[10](); // 10个值初始化为0的int
默认情况下,new分配的对象,不管是单个分配的还是数组中的,都是默认初始化的。这意味着内置类型或组合类型的对象的值是无定义的,而类类型对象将用默认构造函数进行初始化。
int *pi = new int; // undefined int *pia = new int[get_size()]; // undefined Object *pio = new Object; // invoke Object()
也可以对分配的对象进行显式值初始化,方法是在后面跟一对空括号,不过不支持对数组中对象初始化特定的值。
// ... means parameter list int *pi = new int(); // 0 int *pii = new int(1); // 1 int *pia = new int[get_size()](); // 0 0 0.. int *piaa = new int[2](...); // error: parenthesized initializer in array new Object *pio = new Object(...); // invoke Object(...) Object *pio = new Object[size](...); // error: parenthesized initializer in array new
另外C++ 11也提供了一个元素初始化器的花括号列表,支持对单个分配的和数组中的对象初始化为特定的值。
int *pi = new int{}; // 0 int *pii = new int{1}; // 1 int *pia = new int[get_size()]{}; // 0 0 0 .. int *piaa = new int[2]{2, 1}; // 2 1 Object *o = new Object{}; // invoke Object() Object *o = new Object{Object()}; // invoke Object() Object *o = new Object[size]{Object()..};// invoke Object()..
从上面可以看出,空括号相当于传参,而花括号其实相当于赋值。这也解释了为什么空括号不支持对数组中对象初始化特定的值,而花括号却可以。