int* some = new int[5]; //这个数组没有进行初始化
int* ssome = new int[5](); //这个数组就初始化了
如果写成new int()[5]
,我能这么理解:在堆区中生成能存放5个调用int类型的无参构造器生成的int类的实例的空间.而`new int[5]则是只在堆中开辟5个可以存放int类的实例的空间. 因为前者调用了构造器,可能在构造器内初始化了值为0,因此前者开辟出来的空间中已经是全部元素初始化为0的数组了,而后者还没有初始化.
但是new int[5]()
我只能理解成: 在堆上创建一个 使用无参构造器生成的长度为5的int数组的复合类型 的空间 然后这个复合类型的无参构造器会将类型中的值全部初始化?...这好像也说得过去吧
然后我测试了一下
int *test = new int()[5];
好吧,失败了,编译不通过.可能是int这个类不存在无参构造器所以不允许我这么写,那我自己来创造一个,如下:
int main(int argc, char** argv) {
class test {
public:
test() {};
~test() {};
};
// test *t = new test()[5]; 编译不通过
test *t = new test[5](); //编译通过且能运行
}
我就不能理解为什么第一种构造方式通过不了,第二种构造方式却能通过?test这个类从头至尾就是我自己定义的,我也没有搞过test[]这种复合类型的定义啊.
并且,如果使test类的构造器有且只有test(int),那么test *t = new test[5]();
编译不通过,test *t = new test[5](0);
编译不通过,test *t = new test(0)[5];
编译不通过...
那么我之前对new int[5]()的理解显然是不对的,那么正确的理解到底是啥?
另外对于一个不存在无参构造器的类,如何new []多个它呢?
你没理解错,
new int[5]()
后面的()
部分确实是用来初始化用的, 只不过 new 操作在创建类型数组时, 只允许使用无参的缺省构造器. 所以test *t = new test[5](0);
是行不通的.new 完整整法:
placement
如果重载 new,则提供了一种传递附加参数的方式。
type-name
指定要分配的类型;它可以是内置类型,也可以是用户定义的类型。 如果类型规范非常复杂,则可用括号将其括起来以强制实施绑定顺序。
initializer
为初始化对象提供值。 不能为数组指定初始值设定项。 仅当类具有默认构造函数时,new 运算符才会创建对象的数组。