Explicit C++ 关键词
近来看到有书上的构造函数上写有explicit的关键词,出于好奇查个究竟,why?
原因很简单:
当构造函数的参数只有一个的时候,编译器会默认将
Type obj=0转换为Type obj(0)
或者obj = Type(0)
当然这还不局限于整数等情况
错误例子1:
class MyClass
{
MyClass();//这个是必须的
MyClass (int a);
};
在其他函数中这样调用
{
MyClass a; //如果没有默认构造函数这里就会出错
int ac = 3;
a = 4;//这里想写ac=4
}
那么这里就会有问题,因为编译器隐式转换为a = MyClass(4);记住这里的=可是基于bit的赋值,也是编译器默认提供的
当然如果你有写operator =()这个函数,那就另当别论。
错误例子2:
class MyClass
{
MyClass (int a);
};
其他函数里这样调用
{
MyClass a =4;//这里隐式转换为MyClass a(4)
}
所以很容易照成错误。而且这个错误不是编译错误,而是运行时可能的bug。
所以为了避免让大家犯错误,我们只有小心的设计自己的类
class MyClass
{
explicit MyClass (int a);
};
这样如果程序中再调用MyClass a =4;这样语句,程序就会报编译错误。
其实我们写程序不光为了让别人看懂,程序运行正确,还要想方设法的让大家少犯错误。
当然如果你的构造函数必须多于一个参数,其实就没有必要用explicit关键字了。
explicit的关键字只构造函数中带一个参数的情况起作用。其书面语的作用为:禁止单参构造函数的隐式转换。