初始化构造函数默认参数的首选方法是什么?

时间:2019-02-19 08:26:06

标签: c++ c++11 constructor default-parameters

我已经看到了以下两种默认方式来初始化构造函数中的参数(这也适用于普通的自由函数)。

#include <string>
using UserDefinedType = std::string;

class MyClass
{
    UserDefinedType m_member;
public:
    // Way - 1
    MyClass(const UserDefinedType &obj = UserDefinedType()) : m_member{ obj } {}
    // Way - 2
    //MyClass(const UserDefinedType &obj = {}) : m_member{ obj }  {}
};
  • 我知道第一个会防御性地(明确地)调用构造函数    用户定义类型。第二种情况会发生什么
  • 与现代编译器一起练习的首选方式(C ++ 11 或更高版本)?

1 个答案:

答案 0 :(得分:3)

这是个人喜好问题,这两个选项的作用或调用没有影响。我猜想不重复键入类型是常识,

const int three = static_cast<int>(3.14);
const Sub* sub = dynamic_cast<Sub*>(&baseInstance);

通常用auto写下

// better, the concrete type is only typed once, less maintainance "burden":
const auto three = static_cast<int>(3.14);
const auto* sub = dynamic_cast<Sub*>(&baseInstance);

您可以使用此参数并将其转移到上面的示例代码段中:

MyClass(const UserDefinedType &obj = UserDefinedType());

在这里,该类型拼写了两次,这是不希望的。因此,我建议使用

// Shorter, not less readable - a default-constructed default instance:
MyClass(const UserDefinedType &obj = {})

请注意,在构造函数的特殊情况下,将类内成员初始化与默认构造函数和附加重载(例如,

)一起使用同样简单
MyClass {
  public:
    MyClass() = default;
    explicit MyClass(const UserDefinedType& obj) : m_member{obj} {}

  private:
    UserDefinedType m_member = {};
};

此方法的优点是,当向类添加新的构造方法重载时,引入错误的可能性很小。但这是一个细微差别。但是请注意,我已经标记了单参数ctor explicit,通常认为这是防止意外的隐式转换的良好实践。