explicit关键字
在 C++ 中,关键字 explicit 用于修饰类的构造函数,防止隐式类型转换的发生。使用 explicit 的原因和好处如下:
1. 防止隐式类型转换导致意外行为
当类的构造函数可以接受一个参数时,C++ 会自动将这种构造函数视为 转换构造函数,允许从参数类型隐式地转换为类类型。这种隐式转换有时会导致难以发现的错误。
示例(未使用 explicit):
#include <iostream>
using namespace std;
class MyClass {
public:
MyClass(int x) {
cout << "Constructor called with " << x << endl;
}
};
void display(const MyClass &obj) {
cout << "Display called" << endl;
}
int main() {
display(42); // 隐式转换:int -> MyClass
return 0;
}
输出:
Constructor called with 42
Display called
上例中,display(42) 本意是传递一个 MyClass 对象,但因为存在单参数构造函数,C++ 自动进行了隐式转换,导致程序逻辑可能不清晰。
2. 用 explicit 禁止隐式转换
通过将构造函数标记为 explicit,可以避免隐式类型转换,只允许显式调用。
修改后代码:
#include <iostream>
using namespace std;
class MyClass {
public:
explicit MyClass(int x) {
cout << "Constructor called with " << x << endl;
}
};
void display(const MyClass &obj) {
cout << "Display called" << endl;
}
int main() {
// display(42); // 错误:不能进行隐式转换
display(MyClass(42)); // 正确:显式创建对象
return 0;
}
输出:
Constructor called with 42
Display called
这里强制要求调用者明确表达意图,代码的可读性和可维护性都得到了提高。
3. 防止类型不安全的操作
使用 explicit 可以防止意外的隐式转换引入类型不安全的行为。例如,防止错误的算术操作或不合理的类型转换。
4. 最佳实践
- 对于接受单个参数的构造函数(包括拷贝构造函数),默认应使用
explicit。 - 如果需要允许隐式转换(如某些类型的轻量级包装器),才不使用
explicit。
5. C++11 和更高版本的扩展
C++11 起,explicit 也可以用于修饰 转换运算符,防止隐式转换。
示例:
class MyClass {
public:
explicit operator int() const { return 42; }
};
int main() {
MyClass obj;
// int x = obj; // 错误:不能隐式转换
int y = static_cast<int>(obj); // 正确:显式转换
return 0;
}
通过使用 explicit,可以更精确地控制类型转换行为,使程序更安全、更易读。
本文来自博客园,作者:海_纳百川,转载请注明原文链接:https://www.cnblogs.com/chentiao/p/18697557,如有侵权联系删除

浙公网安备 33010602011771号