explicit用来防止由构造函数定义的隐式转换。
至于意义和用法,举例说明,
现在有如下两个类:
class cxNoExplicit
{
int m_neInt;
public:
cxNoExplicit(){
m_neInt = 0;
}
cxNoExplicit(int neInt){
m_neInt = neInt;
}
};
class cxExplicit
{
int m_eInt;
public:
explicit cxExplicit(){
m_eInt = 0;
}
explicit cxExplicit(int eInt){
m_eInt = eInt
};
分别对两个类进行构造:
cxNoExplicit noExp;
cxExplicit exp;
noExp = 1;
exp = 2;
这时候 exp = 2 会报错,而noExp = 1 不会报错。
exp = 2;
首先会调用构造函数cxExplicit(int eInt);再调用默认的operator=。由于构造函数呗限制了explicit,所以不能进行隐式转换。编译器报错。
最后。
effective c++中说:被声明为explicit的构造函数通常比其non-explicit兄弟更受欢迎。因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。除非我有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit