c++ - 构造函数中的数组

标签 c++ oop

下面的代码会发生什么?

我猜它不起作用,因为如果我想向 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/

相关文章:

c++ - 区分 C++11 原始类型名称和 typedef 名称?

c++ - ABI 规范中的内存布局是否仅适用于 ABI 边界?

JavaScript - 更新/重新初始化对象

定义和声明之间的 C++ 说明符

oop - fortran 中的过程 nopass 与普通函数

c++ - do\while 语句将无法正确编译(初学者)

java - 如何使用 libcurl 从 C 或 C++ 客户端调用 gwt rpc servlet?

c++ - 了解此示例中的移动构造函数行为

OOP:将对象与将属性传递给方法

Java OOP多态设计/问题