您的位置:首页 > 编程语言 > C语言/C++

C++关键字explicit的用法

2010-11-03 22:48 351 查看
explicit是显示的意思。而且只能修饰构造函数。
因为在类的构造函数中,凡是只带一个参数的构造函数,都定义了一组隐式转化——把构造函数类型转换为该类的类型。
比如:
class Explicit
{
private:
int _i;
public:
Explicit(int i )
{
// TODO Auto-generated constructor stub
_i = i;
printf("Explicit 构造函数[%d]./n", _i);
}
virtual
~Explicit( )
{
// TODO Auto-generated destructor stub
printf("Explicit 析构函数[%d]./n", _i);
}
};
则:调用:
Explicit e = 1;
打印:
Explicit 构造函数[1].
Explicit 析构函数[1].
调用:
void fun(Explicit e)
{
}
fun(1);
打印:
Explicit 构造函数[1].
Explicit 析构函数[1].
fun(1)相当于:
{
Explicit tmp =
Explicit(1);

fun(tmp);
}
tmp 只在{}内有效,运行到{}外则释放掉tmp
注意:一:如果有下定义:
class Number
{
public :
Number(Explicit e)
{
printf("Number 构造函数./n");
}
virtual
~Number( )
{
printf("Number 析构函数./n");
}
};
void func(Number n)
{
}
func(1);
编译会报错:: 错误:请求从 ‘int’ 转换到非标量类型
‘Number——也就是编译器不会先把1转化为Explicit再转化为Number ;
注意:二:
double i = 1.01;
fun(i);
编译器会首先做一个类型转换,将double 类型转换为int类型。但是会有告警。
在构造函数前面加上关键字“explicit”可以消除这种隐式转化:
explicit Explicit(int i )
编译会议提示错误:: 错误:请求从 ‘int’ 转换到非标量类型
‘Explicit’
被声明为explicit的构造函数比其non-explicit构造函数更好一些,因为他可以禁止编译器执行非预期的类型转换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: