天天看点

关键字explicit小议

内容:

    在C++语言中有这样一个关键字explicit,也许你不经常用到它或者压根就根本就没有见过它,

那这个关键字到底有什么作用呢?C++语言标准中为什么要将它作为一个关键字标准列入标准当中

呢?带着这些问题我们稍微地认识一下这个"家伙",呵呵.

    我们先来看一段code:

    class TestClass{

    public:

        TestClass(int value):value_(value){}

        ...

    private:

        int value_;       

    };

    接下来我们开始使用这个类:

    //test.cpp

    ...

    TestClass myClass(10);

    ...

    这样写,OK!,没问题,不过如果我改成另外一种写法:

    TestClass myClass = 10;//嗯??是不是觉的看起来有点不那么舒服,呵呵!

    ...

    这样写的结果,其实还是没问题,为什么呢?原因在于编译器在编译这条语句的时候用进行了一个

默认的隐式转换操作,它把这里TestClass myClass = 10;转换为TestClass myClass(10);哇!它怎么

做出这样的事情呢?我压根就没想让它这么做,真是不可原谅,那么我们有没有什么办法不让编译器进

行这中莫名其妙的转换呢?当然有!这个时候我们的主角explicit就闪亮登场了,哒哒哒哒..

    explicit就是为阻止这种转换而生的,它提供给了程序员对自己写的代码所产生预期结果的更多

控制,我们添加了关键字后,代码变为:

    class TestClass{

    public:

        explicit TestClass(int value):value_(value){}

        ...

    private:

        int value_;       

    };

    再次编译test.cpp:

    TestClass myClass = 10;// error :'initializing' : cannot convert from 'int' to 'TestClass'

    嘎嘎..,没编译过,这结果正是我们想要的,因为explicit的修饰使的编译器不再为这段代码产生

等价的转换代码.现在你知道explicit关键字的作用了吧?

    请记住:

    ◆explicit关键字阻止了编译器对单参类构造函数的隐式转换.

    ◆explicit只对只有一个参数的构造函数类起作用

继续阅读