如果在arr。
之前定义了大小,则可以创建这样的数组const int size = 5;
int arr[size];
但是当size和arr在object或struct中时,它是不可能的:
struct A{
A(int s) : size(s)
{}
const int size;
int arr[size]
};
A(5);
为什么会这样?这看起来有点不合逻辑,因为在这两种情况下,数组的大小在编译时都是已知的。
答案 0 :(得分:2)
在这两种情况下,数组的大小在编译时都是已知的。
不,可以在运行时设置const
类成员。
事实上,即使是非会员也不总是有效:
int x;
cin >> x;
const int y = x;
int z[y]; //ILLEGAL
只需使用std::vector
。
答案 1 :(得分:2)
这似乎有点不合逻辑,因为在这两种情况下,数组的大小在编译时都是已知的。
编译器无法区分您的示例和此:
int i = std::rand(); // not a compile time constant
A a(i);
另一方面,它需要在编译时知道数组的大小。 A
的两个实例不能有不同的大小。因此,数组的大小不能依赖于可以在运行时设置的东西。
另一方面,C ++ 11提供了constexpr,它允许您通过表达式传播编译时常量,并允许您使用它们来初始化数组。
答案 2 :(得分:0)
当编译器编译A时,实际上并不能保证它是编译时参数。它碰巧是一个。我同样可以做到
int main() {
std::cin >> i;
A(i);
}
如果要传递constexpr参数,则需要使用模板。否则,您将需要使用像std :: vector这样的运行时容器。
答案 3 :(得分:0)
如果需要动态可调整大小的数组,则应使用std::vector<int>
而不是原始数组。
您无法在class
或struct
内执行您要执行的操作,因为您的size
成员没有定义的值。
答案 4 :(得分:0)
因为在C ++中初始化带有size参数的C样式数组时,大小必须是编译时整数常量。
否则编译器在编译时不知道变量有多大。
如果你不喜欢这样,你应该使用vector
。
答案 5 :(得分:0)
在第二种情况下,如果考虑到类定义,则在编译时不知道数组大小。
如果允许这样的课程,你可以写
A(5);
A(6);
这将是不同大小的对象,会破坏很多,例如,不可能将这些对象保留在同一个数组中。可以合理地说这些对象具有不同的类型,如果您创建类模板并将大小作为模板参数传递,那将是可能的。
如果要使用不同大小的数组,请使用std :: vector或templates。
答案 6 :(得分:-1)
如果在编译时之前不知道,则需要动态地从堆中分配内存。
int * arr = new int [size];
如果您不再需要内存,则应删除该阵列。
删除[] arr;
而Tony也说,最好使用标准的libary矢量