【问题标题】:Is there a convenience constructor in C++? [duplicate]C ++中有便利构造函数吗? [复制]
【发布时间】:2017-06-26 03:55:06
【问题描述】:

重载的构造函数是否可能以某种方式调用类中的另一个构造函数,类似于下面的代码?

class A {
public:
    A(std::string str) : m_str(str) {}
    A(int i) { *this = std::move(A(std::to_string(i))); }

    std::string m_str;
};

上面的代码有效,但我担心在构造函数中调用它可能会导致未定义的行为。

如果可以,请解释原因并提出更好的替代方案?

【问题讨论】:

  • 您要查找的术语是“委托构造函数”。
  • 为什么不A(int i) : m_str(std::to_string(i)) {}
  • 这是一个最小的例子。我想重载一个接受 7 个参数的构造函数,其中 4 个具有默认值,并且我想避免在多个位置显式设置默认值。
  • @Makaronodentro:但你还是得给默认值两次,不是吗?
  • @LightnessRacesinOrbit 否,默认值:A(std::string str1, str::string str2="abc") : m_str1(str1), m_str2(str2) {} 委托:A(int i) : A(std::move(std::to_string(i))) {}

标签: c++ constructor this rvalue constructor-overloading


【解决方案1】:

C++11 引入delegating constructors:

class A
    {
    public:
    std::string m_str;
    A(std::string str) : m_str(str) {} // target constructor
    A(int i) : A(std::to_string(i)) {} // delegating constructor
    };

【讨论】:

  • 可能值得m_str(std::move(str))
  • 可能值得注意的是,目标构造函数在委托构造函数之前被调用,因此在后者的主体中,您可以假设前者被调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
相关资源
最近更新 更多