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

标签 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 或以后)?

最佳答案

这是个人喜好问题,这两个选项的作用或调用没有任何影响。我想这是常识,不要像在

中那样重复键入类型
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 = {};
};

这种方法的优点是在类中添加新的构造函数重载时引入错误的可能性很小。但这是一个细微差别。但是请注意,我已将单参数构造函数标记为 explicit,这通常被认为是防止意外隐式转换的良好做法。

关于c++ - 初始化构造函数的默认参数的首选方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54761712/

相关文章:

C++11 智能指针 Make 可变大小对象函数

c++ - constexpr 函数求值可以做尾递归优化吗

c++ - 将函数对象分配给函数包装器后出现意外行为

c++ - 构造函数还是复制构造函数?

C++ 表达式必须有常量值

c++ - 在 C++ 中使用 sprintf 和 std::string

c++ - 默认构造函数是否初始化内置类型?

c++ - 初始化 const 对象中的引用

c++ - 关于内联函数的困惑

c++ - 在C++中找出无限范数的相对误差