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的关键字只构造函数中带一个参数的情况起作用。其书面语的作用为:禁止单参构造函数的隐式转换。