Skip to content

explicit

作用:防止编译器进行不期望的隐式类型转换

使用场景:单参数构造函数、转换运算符

好处:提高代码安全性,明确编程意图

现代C++建议:默认给单参数构造函数加上explicit,多参数构造函数通常不需要explicit

不使用explicit

cpp
class FooClass{
public:
    FooClass(int x) : data(x) {}
private:
    int data;
};

int main(int argc, char const *argv[])
{
    FooClass foo(10); // 正确,显式调用构造函数
    FooClass foo2 = 20;  // 正确,隐式调用构造函数
    return 0;
}

使用explicit

cpp
class FooClass{
public:
    explicit FooClass(int x) : data(x) {}
private:
    int data;
};

int main(int argc, char const *argv[])
{
    FooClass foo(10); // 正确,显式调用构造函数
    // FooClass foo2 = 20; // 错误,不能进行隐式
    return 0;
}

示例:禁止隐式转换

cpp
#include <iostream>

class FooClass{
public:
    explicit FooClass(int x) : data(x) {}

    void show() const{
        std::cout << "Data: " << data << std::endl;
    }
private:
    int data;
};

void printValue(const FooClass& foo){
    // 打印逻辑
    foo.show();
}

int main(int argc, char const *argv[])
{
    
    // FooClass foo2 = 20; // 错误,不能隐式转换
    // printValue(20); // 错误,不能隐式转换

    FooClass foo(10); // 正确,直接初始化
    FooClass foo1 = FooClass(10); // 正确,显式转换
    printValue(FooClass(10)); // 正确,显式调用构造函数

    return 0;
}