C++中的explicit
2021-04-12
2 min read
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 关键字以防止隐式转换;
版权声明:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!