加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 构造函数中的数组

发布时间:2020-12-16 09:38:21 所属栏目:百科 来源:网络整理
导读:以下代码中会发生什么? 如果我想在b数组中添加一些内容,我认为它不起作用,因为我得到了一个分段错误,但我到底做了什么呢? 有没有办法在构造函数中指定数组的大小? class A { public: A() { b[3]; } private: B b[];}; 解决方法 B b []这里是一个“ flexib
以下代码中会发生什么?

如果我想在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?

不,没有.

数组边界必须在编译时知道,因此在ctor体中你不会比在类定义中知道更多;您需要在成员的声明中编写维度:

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;
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读