使用类内成员初始化委派构造函数

Delegating Constructors with In-Class Member Initialization

本文关键字:初始化 委派 构造函数 成员      更新时间:2023-10-16

我想做以下事情:

class DelegatingCTorPlusInClass
{
public:
  DelegatingCTorPlusInClass()
    :
    DelegatingCTorPlusInClass(m_a, m_b) // m_a and m_b are "random"
  {
  };
  DelegatingCTorPlusInClass(int a)
    :
    DelegatingCTorPlusInClass(a, m_b) // m_b is "random"
  {
  };
  DelegatingCTorPlusInClass(const std::string &b)
    :
    DelegatingCTorPlusInClass(m_a, b) // m_a is "random"
  {
  };
  DelegatingCTorPlusInClass(int a, const std::string &b)
    :
    m_a(a),
    m_b(b)
  {
    // DO THINGS
  };
private:
  int m_a = 42;
  std::string m_b = "42";
};

然而,从一个构造函数传递到另一个构造函数的成员尚未初始化,因此基本上是"随机"的。那我怎么能取得类似的成绩呢

[class.base.init]/9:

如果给定的非静态数据成员同时具有大括号或相等初始值设定项mem初始值设定项,则执行mem初始值设置项括号或相等初始化项

这证明了在主构造函数中使用垃圾分配成员是合理的:

DelegatingCTorPlusInClass(int a, const std::string &b)
    :
    m_a(a), // this is mem-initializer for m_a, so m_a = 42 is ignored and you are getting garbage
    m_b(b) // the same for m_b
{
};

为了避免默认值的重复,您可以为它们使用常量,这样您就可以使用以下内容:

DelegatingCTorPlusInClass() : DelegatingCTorPlusInClass(m_a_default, m_b_default)
{
};

您希望从具有较少参数的构造函数中构建默认值,而不是依赖于内联初始化。

class DelegatingCTorPlusInClass
{
public:
  DelegatingCTorPlusInClass()
    :
    DelegatingCTorPlusInClass(42, "42") // default values
  {
  };
  DelegatingCTorPlusInClass(int a)
    :
    DelegatingCTorPlusInClass(a, "42") 
  {
  };
  DelegatingCTorPlusInClass(const std::string &b)
    :
    DelegatingCTorPlusInClass(42, b) 
  {
  };
  DelegatingCTorPlusInClass(int a, const std::string &b)
    :
    m_a(a),
    m_b(b)
  {
    // DO THINGS
  };
private:
  int m_a;
  std::string m_b;
};

构造函数应该定义该用法的值要求。只有当内联初始化对所有构造函数都为true时,它才有意义。

不需要仅仅因为存在非静态数据成员初始化器和委托构造函数就使用它们。有什么问题

class DelegatingCTorPlusInClass
{
public:
  DelegatingCTorPlusInClass(int a = 42, std::string b = "42")
  : m_a(a), m_b(std::move(b))
  {
    // DO THINGS
  }
private:
  int m_a;
  std::string m_b;
};