C++ explicit关键字

介绍

在C++中,explicit是一个关键字,用于修饰类的构造函数或转换函数。它的作用是禁止隐式类型转换,只允许显式调用。

隐式类型转换的一个直观的例子:

1
可以使用std::string s = "c++" 代替 std::string s("c++")

使用C++ explicit关键字举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MyClass {
public:
explicit MyClass(int x) {
// 构造函数的实现
}
};

void func(MyClass obj) {
// 函数的实现
}

int main() {
MyClass obj1(5); // 使用显式构造函数进行对象的初始化
MyClass obj2 = 10; // 错误!不能使用隐式构造函数进行对象的初始化
func(obj1); // 正确!对象作为参数传递给函数
func(20); // 错误!不能使用隐式构造函数进行参数的隐式转换
return 0;
}

Effective C++中写道:

声明为explicit的构造函数禁止编译器执行非预期的类型转换

总结

构造函数只具有一个参数时,通常使用explicit 关键字

构造函数具有一个非缺省参数和多个缺省参数,通常使用explicit 关键字

构造函数具有一个以上的非缺省参数时不使用 explicit 关键字