#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 [] []的示例,以及是否可以在动态数组中初始化实例。我的问题是:
我打算创建一个10 CType
个实例的数组,其中val
初始化为10.但是这行不能通过编译。我必须添加一个没有参数和CType *t = new CType[10]
的默认构造函数。有没有办法创建一个实例数组并使用一些参数调用构造函数?
我对new int[10][10]
感到困惑,它直观地创建了一个10x10 2D阵列。但我找不到任何定义new int[][]
或new int[][][]
等行为的官方材料。为什么new int[10][10]
返回类型为int (*)[10]
而不是int**
或{{1 }}
顺便说一句,如果我写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
的最后一个元素首先被破坏。
答案 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 int
和new 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)
new int[N][4][5][6]
创建一个由N个元素组成的数组,每个元素都是int [4] [5] [6]。将返回指向数组第一个元素的指针。它将是int(*)[4][5][6]
类型,而不是int****
或类似的类型。如果你接受C ++中有 no 多维数组,只有数组数组,这很容易理解。 int x[2][3]
的元素的类型为int[3]
,而不是int
。 pointer to the first element
之类的字词不会自动推广到pointer to the first element of the first element
等。