在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只对只有一个参数的构造函数类起作用