八叶一刀·无仞剑

万物流转,无中生有,有归于无

导航

C++的explicit关键字

Posted on 2021-04-28 11:33  闪之剑圣  阅读(101)  评论(0编辑  收藏  举报

在C++中,有一些构造函数可以进行隐式类型转换,比如下面的例子:

class Widget
{
  public:
    Widget();                         //构造函数1,不能进行隐式转换
    Widget(int a);                    //构造函数2,可以进行int的隐式转换
    Widget(float a, int b=0,int c=0); //构造函数3,可以进行float的隐式转换
};

上面Widget类有三个构造函数,其中构造函数2和3都可以进行隐式转换:

Widget w;
w = 2;
w = 3.5f;

从中也可以看到,只有一个参数的构造函数,或者构造函数有n个参数,但有n-1个参数提供了默认值,这样的构造函数才能进行隐式转换。
这种隐式的转换有时并不一定是合乎要求的,可能会导致一些隐藏的bug;因此C++11新增了关键字explicit,可以禁止这种隐式转换:

class Widget
{
  public:
    Widget();                             
    explicit Widget(int a);                
    explicit Widget(float a, int b=0,int c=0);
};

这样一来,无论是哪个构造函数都不能再进行隐式转换了:

Widget w;
w = Widget(2);
w = (Widget)3;