C++中的explicit

C++中的explicit

引言

在C++开发中,常会因为各种原因无意中编写出如下代码:

class Demo {
public:
    Demo() = default;
    Demo(const int a);
    Demo(const double b, const double c=2.5, const double d=3.5);
    ~Demo() = default;
    // ...
private:
    int m_a;
    double m_b;
};

int main()
{
    Demo demo = 10;  // 编译通过,但这不是我们想要的行为
    
    // ...
    return 0;
}

上述代码编译通过,即编译器允许这种操作,这实际上是调用了构造函数 Demo(const int a) 进行了隐式转换,但此操作很可能是开发人员不希望发生的,程序有可能会在运行中发生意想不到的错误,所以需要一种机制禁止这种隐式转换;

方法

C++提供了在构造函数中添加 explicit 关键字来防止上述问题的发生,在 Qt 库中,经常可以看到此种习惯,这减少了程序隐患,值得我们学习参考;

上述代码改进后,如下所示:

class Demo {
public:
    Demo() = default;
    explicit Demo(const int a);
    explicit Demo(const double b, const double c=2.5, const double d=3.5);
    ~Demo() = default;
    void update();
    // ...
private:
    int m_a;
    double m_b;
};

int main()
{
    Demo demo = 10;  // 编译不通过,符合我们对程序行为的预期
    
    // ...
    return 0;
}

结论

最佳实践:在类构造函数中,只要能使用一个参数的,均加上 explicit 关键字以防止隐式转换;


本文作者: 王同学