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