全部博文(842)
分类: LINUX
2012-03-06 15:33:30
explicit主要用于"修饰"构造函数.
使得它不用于程序中需要通过此构造函数进行"隐式"转换的情况!
指定此关键字,需要隐式转换方可进行的程序将会不能通过.
而可通过强制转换使它没有用.
explicit,和构造函数一起使用.
explicit constructor指明构造函数只能显示使用,目的是为了防止不必要的隐式转化.
举个例子:
有这样一段代码:
class A
{
public:
A(int);
private:
int num;
};
int Test(const A&) // 一个应用函数
{
...
}
Test(2); // 正确
过程是这样的: 编译器知道传的值是int而函数需要的是A类型,但它也同时知道调用A的构造函数将int转换成一个合适的A,所以才有上面成功的调用.换句话说,编译器处理这个调用时的情形类似下面这样:
const A temp(2); // 从2产生一个临时A对象
Test(temp); // 调用函数
如果代码写成如下样子:
class A
{
public:
explicit A(int);
private:
int num;
};
int Test(const A&) // 一个应用函数
{
...
}
Test(2); // 失败,不能通过隐式类型转换将int类型变量构造成成A类型变量
再来一例:
是为了防止单参数的构造函数的隐式转化。比如说有一个类 Rational 表示一个复数,如下:
class Rational
{
public:
int _x;
int _y;
Rational( int x = 0,int y = 0 )
{
_x = x;
_y = y;
}
};
void printValue(const Rational& ra)
{
cout << ra._x << ra._y <
}
如果是不用explicit 关键字,则象下边的东西也是合法的:
int x;
printValue( x );
如果用了explicit 关键字,这个是不合法的,我们一定要写成如下格式:
printValue( Rational( x ) )才成,这样就避免了隐式转化带来的bug