下面的代码会发生什么?
我猜它不起作用,因为如果我想向 b 数组添加一些东西,我会遇到段错误,但我在这里到底做了什么?
有没有办法在构造函数中指定数组的大小?
class A {
public:
A() {
b[3];
}
private:
B b[];
};
最佳答案
B b[]
这里是一个“flexible array member”,它是编译器中的一个非标准扩展(取自 C99),它允许您将无界数组声明为数组中的最后一个成员类型。它仅在以老式 C 方式分配对象时有用(当您将参数填充到 malloc
以为数组腾出空间时),应该避免使用。在这种情况下,你没有为数组分配任何额外的内存,所以在你的构造函数主体中,当你试图访问在这个虚无之后出现的 3 个“元素”的东西时,你正在调用UB。我将忽略其余答案的扩展名,因为它在 C++ 代码中确实没有位置。
Is there no way of specifying the size of an array inside the constructor?
不,没有。
数组边界必须在编译时已知,因此在构造函数体中您所知道的绝不会比在类定义中知道的更多;您需要在成员的声明本身中写入维度:
class A {
B b[3];
};
如果维度是程序中的运行时量,则需要存储一个指针,并在构造函数中将其指向动态内存块:
class A {
public:
A() : b(new B[3]) {}
~A() { delete[] b; }
private:
B* b; // same as `B b[]`! but far clearer
};
不过,我建议使用 std::vector
:
class A {
public:
A() : b(3) {}
private:
std::vector<B> b;
};
关于c++ - 构造函数中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8071440/