关于new [] []和初始化数组中的类

时间:2014-03-02 08:27:34

标签: c++ arrays constructor

#include <iostream>
using namespace std;

class CType{
private:
    int val;
public:
    CType(): val(0){}
    CType(int x): val(x){}
    void setVal(int x){ val = x; }
    ~CType(){ cout << val << " is destructed." << endl;} 
};

int main(){
    // CType *t = new CType[10](10); // -1-
    CType (*t)[10] = new CType[10][10]; // -2-
    for(int i = 0; i < 10; ++i){
        for(int j = 0; j < 10; ++j){
            t[i][j].setVal(10 * i + j);
        }
    }
    delete[] t;
    return 0;
}

上面的代码是我编写的用于测试new [] []的示例,以及是否可以在动态数组中初始化实例。我的问题是:

  1. 我打算创建一个10 CType个实例的数组,其中val初始化为10.但是这行不能通过编译。我必须添加一个没有参数和CType *t = new CType[10]的默认构造函数。有没有办法创建一个实例数组并使用一些参数调用构造函数?

  2. 我对new int[10][10]感到困惑,它直观地创建了一个10x10 2D阵列。但我找不到任何定义new int[][]new int[][][]等行为的官方材料。为什么new int[10][10]返回类型为int (*)[10]而不是int**或{{1 }}

  3. 顺便说一句,如果我写int[10][10],我会在阅读CType (*t)[10] = new CType[10][10](10)时遇到编译错误。有趣, g ++ 说SORRY。


    更新

    我正在使用 g ++ 。但我也测试了 VS2010 上的代码。它通过编译并输出与 g ++ 中相同的结果。

    A.cpp:13:39: sorry, unimplemented: cannot initialize multi-dimensional array with initializer中的变量t是一个指向10 CType (*t)[10]个实例的数组的指针,而不是10个CType指针的数组。因此,CType指向t + 1之后sizeof(CType) * 10个字节的位置。

    我的代码输出显示t的破坏顺序是99到0. delete[] t的最后一个元素首先被破坏。

2 个答案:

答案 0 :(得分:3)

  

有没有办法创建一个实例数组并使用一些参数调用构造函数?

从C ++ 11开始:

CType* t = new CType[10] {10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
// ...
delete[] t;

但总的来说,你在C ++中的向量方面要好得多:

std::vector<CType> t(10);
// ...
// no need to delete anything manually!
  

我找不到任何定义new int[][]new int[][][]等行为的官方资料。

5.3.4 [expr.new]§5说:

  

当分配的对象是一个数组[...]时, new-expression 会产生一个指向数组初始元素(如果有)的指针。

     

注意:new intnew int[10]都有int*类型,new int[i][10]类型为int (*)[10]


  

为什么new int[10][10]的返回类型为int (*)[10]而不是int**

它不能是int**,因为这样一个简单的delete[]是不够的。

  

int[10][10]

因为int[10][10]不是指针,但new总是返回指针。

答案 1 :(得分:0)

  1. 无法在数组类型的new-expression中提供括号初始值设定项。如果可以提供帮助,请不要使用旧版C阵列。标准容器提供了更好的选择。
  2. 这是由标准规定的。分配数组的new-expression返回指向数组第一个元素的指针(5.3.4 / 1)。 new int[N][4][5][6]创建一个由N个元素组成的数组,每个元素都是int [4] [5] [6]。将返回指向数组第一个元素的指针。它将是int(*)[4][5][6]类型,而不是int****或类似的类型。如果你接受C ++中有 no 多维数组,只有数组数组,这很容易理解。 int x[2][3]的元素的类型为int[3],而不是intpointer to the first element之类的字词不会自动推广到pointer to the first element of the first element等。