【问题标题】:c++ make implicit copy constructor use initialization listc++ 使隐式复制构造函数使用初始化列表
【发布时间】:2013-06-07 21:05:04
【问题描述】:

我们都知道隐式复制构造函数的操作如下:默认构造所有成员变量,然后为每个成员变量分配相应的值。

我经常需要一个复制构造函数,它初始化每个成员变量作为一个副本,而不是默认构造然后分配。 (例如,我有一些 const 成员变量)。

问题:手动编写一个复制构造函数,初始化每个成员变量作为一个副本是非常乏味的,并且像数字一样近乎荒谬成员变量的增长。有没有办法让隐式复制构造函数使用初始化列表?有没有其他方法可以手动编写初始化列表?

【问题讨论】:

  • “我们都知道隐式复制构造函数的操作如下......”不,这对我来说是新闻。 (因为它不这样做)
  • “我们都知道……”真的吗?隐式生成的复制构造函数已经做了你想要的。
  • 好吧,我们都知道...不同

标签: c++ class constructor initialization copy-constructor


【解决方案1】:

我们都知道隐式复制构造函数的操作如下:默认构造所有成员变量,然后为每个成员变量分配相应的值。

不,它实际上不是那样工作的。 C++11 标准第 12.8/15 段规定:

非联合类X的隐式定义复制/移动构造函数执行成员方式复制/移动 其基地和成员。 [...] 每个基础或非静态数据 成员以适合其类型的方式复制/移动:

——如果成员是一个数组,每个元素直接用x的对应子对象初始化;

——如果成员m有右值引用类型T&&,则直接用static_cast<T&&>(x.m)初始化;

否则,基址或成员将直接使用x 的相应基址或成员进行初始化。

换句话说:

通常我需要一个复制构造函数,它将每个成员变量初始化为一个副本,而不是默认构造然后赋值。 (例如,我有一些 const 成员变量)。

你的愿望已经成为现实。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2022-12-14
    相关资源
    最近更新 更多