C++关键字之explicit

来源:互联网 发布:windows一直在准备配置 编辑:程序博客网 时间:2024/06/07 12:02

explicit翻译过来就是“显式”!

顾名思义:

当我们用该关键字修饰该一个类的构造函数时,该类对象:

1、不允许通过隐式类型转换得到;

2、只能通过显示调用构造函数获得

通过代码实例来看:

首先,我们定义两个类:

A类构造函数不用explicit修饰

A_e类构造函数用explicit修饰;

class A{private:int a;public:        A(int a=0);int get(){return a;};};A::A(int a){this->a=a;}class A_e{private:int a;public:explicit A_e(int a=0);int get(){return a;};};A_e::A_e(int a){this->a=a;}

现在参考以下两种情况(它们都会尝试进行隐式转换):

一、

A a1=256;//编译器通过隐式转换成功编译运行
A_e a2=256;//explicit修饰,无法进行隐式转换,编译失败

:这种情况是:

1、用int类型的值来对自定义类型A类型的对象进行初始化,由于类型不匹配,编译的时候,编译器执行隐式转换i、先将int类型的256转换成A类型;ii、然后调用copy构造函数初始化a1。),编译通过;

2、int类型的值来对A_e类型的对象进行初始化,而由于A_e类型构造函数由explicit修饰,编译器无法对其进行隐式转换,导致编译失败;



二、

void do(A a1){#do something}do(256);//编译器通过隐式转换成功编译运行void do_e(A_e a2){#do something}do_e(256);//explicit修饰,无法进行隐式转换,编译失败


这里情况是:

1、do函数需要一个A类型的形参,我们却传了一个int类型的实参256给它,由于类型不匹配,编译器编译的时候将进行隐式转换,编译通过;

2、而do_e函数情况类似,而由于它需要的是A_e类型参数,而A_e类型构造函数由explicit修饰,编译器无法进行隐式转换,导致编译失败;


总结:当定义一个类的时候,将其构造函数使用explicit关键字修饰,可以阻止编译器执行非预期(通常也是不被期望)的类型转换。因此,我们应当养成使用explicit关键字的良好习惯。除非有需求的刻意允许隐式转换,否则建议一律将构造函数声明为explicit,防止编译器自动执行隐式转换导致不可知错误。




原创粉丝点击