explicit关键字
c++中explicit的作用
- explicit禁止构造函数隐式转换
所谓的隐式转换就是一个参数以赋值的方式传递给新定义的一个对象,对象会默认调用构造参数,进而可能产生于预期相差甚远的结果。
例如如下代码可防止隐式转换
#include<iostream>
using namespace std;
class Test1
{
public:
Test1(int n){num=n;} //普通构造函数
private:
int num;
};
class Test2
{
public:
explicit Test2(int n){num=n;} //explicit(显式)构造函数
private:
int num;
};
int main()
{
Test1 t1 = 12; //隐式调用其构造函数, 成功
Test2 t2 = 12; //编译错误,不能隐式调用其构造函数
Test2 t3(12); //显示调用成功
return 0;
}
上述代码编译后出现的错误如下图:
explicit关键字在c++实际应用之一
例如你可以声明一个构造函数,以stack的初始大小为参数:
class stack
{
explicit stack(int size);//create stack with initial size
};
在这里explicit就非常重要,如果没有explicit,这个构造函数有能力将一个int自动转型为stack,一旦这种情况发生,你甚至可以给stack指派一个整数而不会引起任何问题,
stack s
s= 40;
这种情况构造函数的隐式转换就会把40转换为有40个元素的stack,这肯定可我们初衷是背离的,如果加上explicit之后,再进行这样的操作,编译器就会报错,我们就可以提早发现错误。