说实话,从来没有感觉到这个keyword实用,直到今天。
explicit 的意思是明显的 , 和它相相应的一个词是 implicit 意思是隐藏的。
我參考了 MSDN 和 《 c++ 标准程序库》对这个keyword的描写叙述,并參考了网络上对这个keyword的解释。现将它的用法和总结记录例如以下:
首先这个keyword仅仅能用在 类构造函数 。它的作用是不能进行隐式转换。
class gxgExplicit // 没有keyword explicit 的类
{
public :
int _size;
gxgExplicit( int size)
{
_size = size;
}
};
以下是调用
gxgExplicit gE1(24); // 这样是没有问题的
gxgExplicit gE2 = 1; // 这样也是没有问题的
gxgExplicit gE3; // 这样是不行的,没有默认构造函数
gE1 = 2; // 这样也是没有问题的
gE2 = 3; // 这样也是没有问题的
gE2 = gE1; // 这样也是没有问题的
可是假如 gxgExplicit 改动为 Stack ,我们的 _size 代表的是堆栈的大小,那么调用的第二句就显得不伦不类,并且easy让人疑惑。这并非能够让代码阅读者明确和接受的形式,尽管它是合法的(编译器能够通过编译)。这是由于编译器默认情况下有隐式转换的功能,你输入 gE2 = 1 就编译成同第一句同样的结果。所以, explicit 就派上了用场。改动代码为:
class gxgExplicit
{
public :
int _size;
explicit gxgExplicit( int size)
{
_size = size;
}
};
继续上面的调用 :
gxgExplicit gE1(24); // 这样是没有问题的
gxgExplicit gE2 = 1; // 这样是不行的,keyword取消了隐式转换
gxgExplicit gE3; // 这样是不行的,没有默认构造函数
gE1 = 2; // 这样是不行的,keyword取消了隐式转换
gE2 = 3; // 这样是不行的,keyword取消了隐式转换
gE2 = gE1; // 这样是不行的,keyword取消了隐式转换,除非类实现操作符“ = ”的重载。
这是编译器( vs2005 )显示: cannot convert from 'int' to 'gxgExplicit' 。
从这里也就看出这个keyword的作用是将编译器隐式转换的功能给屏蔽掉。
MSDN 上有一个注意点描写叙述了以下的事实,当构造函数參数超过两个时自己主动取消隐式转换。比如
class gxgExplicit
{
private :
int _size;
int _age;
public :
explicit gxgExplicit( int age, int size)
{
_age = age;
_size = size;
}
};
这是有没有keyword效果是一样的。那就是相当于有这个keyword。
可是第二种情况例外:当中仅仅有一个必须输入的參数,其余的为有默认值的參数。
class gxgExplicit
{
private :
int _size;
int _age;
public :
explicit gxgExplicit( int age, int size = 0)
{
_age = age;
_size = size;
}
};
class gxgExplicit
{
private :
int _size;
int _age;
int _hight;
public :
explicit gxgExplicit( int age, int size = 0)
{
_age = age;
_size = size;
_hight = hight;
}
};
这种情况下相当于一个參数的效果。
到如今为止。这个keyword就是这么用了。