c++,如何理解new int[5]()?

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 []多个它呢?

阅读 6.7k
2 个回答

你没理解错, new int[5]() 后面的 () 部分确实是用来初始化用的, 只不过 new 操作在创建类型数组时, 只允许使用无参的缺省构造器. 所以 test *t = new test[5](0); 是行不通的.

new 完整整法:

new [placement] new-type-name [new-initializer]  

placement
如果重载 new,则提供了一种传递附加参数的方式。

type-name
指定要分配的类型;它可以是内置类型,也可以是用户定义的类型。 如果类型规范非常复杂,则可用括号将其括起来以强制实施绑定顺序。

initializer
为初始化对象提供值。 不能为数组指定初始值设定项。 仅当类具有默认构造函数时,new 运算符才会创建对象的数组。

你第一个写法解释是 构建int型数组 然后初始化值都为0
第二个其实就是语法不允许 编译不通过

There's no fundamental reason not to allow a more complicated initializer it's just that C++03 didn't have a grammar construct for it. In the next version of C++ you will be able to do something like this.
new int[5] {0, 1, 2, 3, 4};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题