explicit constructors
2019-05-02 本文已影响0人
吃柠檬的鸮
通常情况下,只含有一个参数的构造函数可被用于转换。
// 定义了只含一个 string 参数的构造函数
Foo::Foo(std::string name);
// 传入一个 Foo 类型的值
void Foo::func(Foo f);
Foo foo1;
foo1.func(“AAA”);
// 等价于
// Foo tmp(“AAA”);
// foo1.func(tmp);
但有时候并不希望通过转换生成一个新对象,因此,为避免构造函数被调用造成隐式转换,可以将其声明为 explicit
。
结论:
有单参数的构造函数必须是明确的。在类的定义中,将关键字 explicit
加到单参数的构造函数之前。
有例外的情况是:构造函数可以不声明为 explicit
;特意作为其他类的透明包装器的类的单参数构造函数也可以不声明为 explicit
。例外情况应该在注释中明确说明。