初始化构造函数的默认参数的首选方法是什么?
What is the preferable way of initializing default arguments of a constructor?
我看到了以下两种在构造函数中默认初始化参数的方法(这也适用于普通的自由函数)。
#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 = {})
请注意,在构造函数的特殊情况下,将 in-class 成员初始化与默认构造函数和附加重载一起使用同样简单,例如
MyClass {
public:
MyClass() = default;
explicit MyClass(const UserDefinedType& obj) : m_member{obj} {}
private:
UserDefinedType m_member = {};
};
这种方法的优点是在 class 中添加新的构造函数重载时引入错误的可能性很低。但这是一个细微差别。但是请注意,我已经标记了单参数 ctor explicit
,这通常被认为是防止意外隐式转换的良好做法。
我看到了以下两种在构造函数中默认初始化参数的方法(这也适用于普通的自由函数)。
#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 = {})
请注意,在构造函数的特殊情况下,将 in-class 成员初始化与默认构造函数和附加重载一起使用同样简单,例如
MyClass {
public:
MyClass() = default;
explicit MyClass(const UserDefinedType& obj) : m_member{obj} {}
private:
UserDefinedType m_member = {};
};
这种方法的优点是在 class 中添加新的构造函数重载时引入错误的可能性很低。但这是一个细微差别。但是请注意,我已经标记了单参数 ctor explicit
,这通常被认为是防止意外隐式转换的良好做法。