2

可以创建这样的数组 - 如果在 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);

为什么会这样?这似乎有点不合逻辑,因为在这两种情况下,数组的大小在编译时都是已知的。

4

7 回答 7

2

在这两种情况下,数组的大小在编译时都是已知的。

不,const可以在运行时设置类成员。

事实上,即使是非成员也不总是有效:

int x;
cin >> x;
const int y = x;
int z[y];   //ILLEGAL

只需使用std::vector.

于 2012-11-14T11:37:27.787 回答
2

这似乎有点不合逻辑,因为在这两种情况下,数组的大小在编译时都是已知的。

编译器无法区分您的示例和此:

int i = std::rand(); // not a compile time constant
A a(i);

另一方面,它需要在编译时知道数组的大小。的两个实例A不能有不同的大小。所以数组的大小不能依赖于可以在运行时设置的东西。

另一方面,C++11 提供constexpr,它允许您通过表达式传播编译时常量,并允许您使用它们来初始化数组。

于 2012-11-14T11:37:52.447 回答
0

在第二种情况下,如果考虑到类定义数组的大小在编译时是未知的。

如果允许开设此类课程,您可以编写

A(5);
A(6);

那将是不同大小的对象,这会破坏很多,例如,不可能将这些对象保存在同一个数组中。说这些对象具有不同的类型是合乎逻辑的,如果您制作类模板并将大小作为模板参数传递,这将是可能的。

如果您想使用不同大小的数组,请使用 std::vector 或模板。

于 2012-11-14T11:43:11.400 回答
0

当编译器编译 A 时,实际上并不能保证它是编译时参数。它恰好是一个。我同样可以

int main() {
    std::cin >> i;
    A(i);
}

如果你想给它传递一个 constexpr 参数,你需要使用一个模板。否则,您将需要使用像 std::vector 这样的运行时容器。

于 2012-11-14T11:38:07.370 回答
0

如果您想要一个可动态调整大小的数组,您应该使用std::vector<int>而不是原始数组。

你不能做你想做的事情,class或者struct因为你的size成员没有定义的价值。

于 2012-11-14T11:38:14.573 回答
0

因为在 C++ 中,当您使用大小参数初始化 C 样式数组时,大小必须是编译时整数常量。

否则编译器不知道编译时变量有多大。

如果你不喜欢这个,你还是应该使用vector

于 2012-11-14T11:38:24.933 回答
-1

如果在编译时间之前不知道,则需要从堆中动态分配内存。

int* arr = new int [大小];

如果您不再需要内存,则应删除该数组。

删除[] arr;

正如托尼所说,最好使用标准库向量

于 2012-11-14T11:37:09.600 回答