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 强制转换

}


posted @ 2011-08-02 20:10  lidan  阅读(424)  评论(0编辑  收藏  举报