explicit
explicit用于构造函数的隐式转换
class MyCa
{
public:
MyCa(int a) : m_a(a){}
private:
int m_a;
};
void TestMyCa(MyCa a)
{
//TODO:
}
char ch = 'a';
TestMyCa(ch);//将ch用作参数转换成一个MyCa
避免这种情况就应该使用explicit关键字 : explicit MyCa(int a);
explicit用于转换运算符
class IntWrapper
{
public:
IntWrapper(int i) : m_int(i) {}
explicit operator int() const {return m_int;}
private:
int m_int;
}
IntWrapper c(123);
int ic = static_cast<int>(c);//加上explicit只能使用static_cast强制转换
int ic = c;//不加explicit可以如此调用或者使用static_cast
当然,最好不用转换运算符,使用其他函数代替,如 int AsInt();