explicit 构造函数的意义
在类的构造函数中, 凡是只带有一个参数的构造函数, 都定义了一组隐式转换, 把构造函数的参数类型转换成该类的类型;
如:
Smallint(int)把int型的值转化成Smallint值;
extern void cacl(Smallint);
int i;
//需要把i转换成Smallint值, Smallint(int)能做到这一点
calc(i);
可以理解成:
//创建一个临时对象
{
Smallint temp = Smallint(i);
calc(temp);
}
如果需要,编译器会在调用构造函数的转换之前,在参数上应用标准转换序列;如:
extern void calc(Smallint);
double dobj;
calc(dobj);//通过标准转换,dobj被从double转换到int
编译器隐式的用单参数构造函数,将参数类型的值转换成构造函数类类型的值,可能不是我们所希望的。
为了防止用单参数的构造函数进行隐式的类型转换,我们把单参数的构造函数(包括后面的参数有缺省值的)声明为explicit
此时, 如果需要执行类型转换,只要程序以强制的形式显式的要求转换即可。如:
class Number
{
public:
explicit Number(const Smallint &);
};
extern void fun(Number);
Smallint si(87);
int main()
{
fun(si);//error 从Smallint到Number没有隐式转换
fun(Number(si));//ok cast
fun(static_cast<Number>(si));//ok 强制转换
}