C++ explicit关键字的作用

370 阅读2分钟

C++ 中的explicit关键字主要用于防止构造函数进行隐式类型转换。当构造函数被声明为explicit时,它只能通过显式构造对象的方式进行调用,而不能自动进行隐式类型转换。这有助于避免潜在的错误,提高代码的清晰度和安全性‌12。

explicit关键字的作用

  1. 防止隐式类型转换‌:在C++中,如果一个类的构造函数可以使用一个参数进行初始化,编译器会自动使用这个构造函数进行隐式转换。例如,如果有一个类MyClass的构造函数MyClass(int value),那么在传递一个int类型的值给需要MyClass类型参数的函数时,编译器会自动将这个int值转换为MyClass类型。使用explicit关键字可以阻止这种隐式转换,从而避免潜在的错误‌1。
  2. 提高代码清晰度‌:通过显式调用构造函数,代码的意图更加明确,减少了因隐式转换而导致的混淆和错误‌3。

使用场景

  • 只有一个参数的构造函数‌:当构造函数只有一个参数时,使用explicit关键字可以防止隐式类型转换。例如,class MyClass { explicit MyClass(int value) { ... } }‌12。
  • 多参数构造函数‌:对于那些除了第一个参数外其余参数都有缺省值的构造函数,使用explicit关键字同样可以防止隐式类型转换‌2。

示例代码


class MyClass {
public:
    explicit MyClass(int value) {
        // 构造函数实现
    }
};

void printMyClass(MyClass obj) {
    std::cout << "Function printMyClass called" << std::endl;
}

int main() {
    printMyClass(42); // 错误:不能隐式转换
    re

:::ml-data{name=citationList}
```json
[{"source":{"logo":"https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=2005731947,4139443793&fm=195&app=88&f=JPEG?w=200&h=200","name":"CSDN博客"},"isVideo":false,"title":"C++的explicit","linkInfo":{"data-click-info":"{}","href":"https://blog.csdn.net/weixin_44259499/article/details/141203150","target":"_blank","data-noblank":true,"data-show":"list","data-show-ext":"{"pos":"1","component_content":{"component_name":"reference"}}"}},{"source":{"logo":"https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=2005731947,4139443793&fm=195&app=88&f=JPEG?w=200&h=200","name":"CSDN博客"},"isVideo":false,"title":"7. C++ explicit 关键字详解","linkInfo":{"data-click-info":"{}","href":"https://blog.csdn.net/weixin_46645965/article/details/135354486","target":"_blank","data-noblank":true,"data-show":"list","data-show-ext":"{"pos":"2","component_content":{"component_name":"reference"}}"}},{"source":{"logo":"https://search-operate.cdn.bcebos.com/175c73f4973c6168ed6acae5b638fa15.png","name":"博客园"},"isVideo":false,"title":"C++ explicit关键字 ","linkInfo":{"data-click-info":"{}","href":"https://www.cnblogs.com/1873cy/p/18395886","target":"_blank","data-noblank":true,"data-show":"list","data-show-ext":"{"pos":"3","component_content":{"component_name":"reference"}}"}}]