对象内的数组

时间:2012-11-14 11:34:39

标签: c++ arrays object

如果在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);

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

7 个答案:

答案 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>而不是原始数组。

您无法在classstruct内执行您要执行的操作,因为您的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矢量