目录
主要用于修饰构造函数或者转换运算符,为了增强类型安全性和防止意外的类型转换,防止他们被编译器隐式地用于类型转换。
- class MyString {
- public:
- MyString(const char* str) { /*...*/ }
- // ...
- };
-
- void PrintString(const MyString& str) { /*...*/ }
-
- int main() {
- PrintString("Hello, world!"); // 隐式转换 const char* 到 MyString
- }
这段代码中,PrintString应该接收一个MyString类型得引用作为参数,但是在main中传递一个一个char* str类型给它,由于MyString有一个接受char* str类型得构造函数,编译器自动隐式使用这个构造函数创建一个MyString对象。防止这种转换可以使用explicit关键字:
- class MyString {
- public:
- explicit MyString(const char* str) { /*...*/ }
- // ...
- };
这时再使用PrintString("Hello, world!");会报错。
- class MyClass {
- public:
- operator bool() const { return true; } // 隐式转换到bool
- };
-
- MyClass obj;
- if (obj) { /*...*/ } // obj隐式转换为bool
这里obj会被隐式转换成bool类型,使用explicit之后不会转换:
- class AnotherClass {
- public:
- explicit operator bool() const { return true; } // 明确要求转换到bool
- };
-
- AnotherClass anotherObj;
- // if (anotherObj) {} // 这将导致编译错误,因为explicit阻止了隐式转换
- if (static_cast<bool>(anotherObj)) { /*...*/ } // 这是正确的
这时这里得anotherObj还是原来得类型,如果想使用得化需要自己转换成bool类型。