首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ -混合默认成员初始化程序和成员初始化列表-不好的想法?

C++ -混合默认成员初始化程序和成员初始化列表-不好的想法?
EN

Stack Overflow用户
提问于 2016-12-30 05:18:29
回答 2查看 959关注 0票数 3

这部分是一个风格问题,部分是一个正确性问题。提交以下示例(处理包含嵌入头的数据块的类的剥离):

代码语言:javascript
复制
class Foo {
 public:
  Foo(size_t size)
      : scratch_(new uint8_t[header_length_ + size]),
        size_(header_length_ + size) {
  }
  ~Foo() {
    delete[] scratch_;
  }
  Foo(const Foo&) = delete;  // Effective C++
  void operator=(const Foo&) = delete;  // Effective C++
 protected:
  struct Header {
    uint32_t a, b, c, d;
  };
  uint8_t * const scratch_;
  size_t const size_;
  Header * const header_ = reinterpret_cast<Header *>(scratch_);
  static constexpr size_t header_length_ = sizeof(Header);
  static constexpr size_t data_offset_ = header_length_;
  size_t const data_length_ = size_ - data_offset_;
};

首先,技术正确性..。正如所写的那样,scratch_size_将首先初始化,然后是header_,然后是data_length_,这是正确的吗?(constexpr项是编译时的文字常量,不按初始化顺序排列)。同样正确的是,如何声明初始化程序(无论是默认成员初始化(int foo = 5)还是成员初始化程序列表)对初始化顺序没有影响,但重要的是声明成员的顺序。我找到了这个答案,引用了关于初始化顺序的ISO规范,我收集到的是,相对于其他被赋予默认成员初始化器的成员,scratch_size_出现在成员初始化列表中并不重要;只需要在其他成员之前声明scratch_size_。假设scratch_size_是最后声明的,那么header_data_length_ (不理想/不正确)将首先被初始化。

风格问题..。将这两种初始化样式混在一起是不是很糟糕?我的方法是成员初始化列表(scratch_size_)中的项依赖于传递给构造函数的参数,而其余的类成员则来自其他类成员。显然,如果初始化程序依赖于构造函数参数,那么就有进入成员初始化列表。是否应该将所有初始化器抛到成员初始化列表中,并放弃默认的成员初始化程序?海事组织,这可能会使守则更难遵循。有什么想法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-30 06:46:23

默认成员初始化器的存在不会改变初始化类型的子对象的顺序。它将永远按申报顺序排列。

风格取决于你。您拥有的构造函数越多,通过使用DMIs获得的好处就越多,因为您没有重复不会更改的初始化。同时,如果您开始创建覆盖DMIs的构造函数,则可能会对对象的初始状态产生混淆。关键是不要对发生的事情感到惊讶。

但是,在您的特殊情况下,我会说您有太多的变量。您的数组应该只是一个std::vector<uint8_t>。拥有header_指针是可疑的,但它是可以防御的(尽管它的初始化不正确;您需要使用新的位置来满足C++的对象模型),但是data_length_可以根据需要进行计算。

您拥有的成员越少,就越不可能混淆如何初始化它们。

票数 6
EN

Stack Overflow用户

发布于 2016-12-30 06:05:44

所有论坛、类成员(无论是const还是非const)都建议使用初始化程序列表进行初始化。在您的情况下,它可能不是一个问题,但当类用于扩展时,它可能会出现问题。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41390996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档