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,防止编译器自动执行隐式转换导致不可知错误。
阅读全文
0 0
- C++:explicit 关键字
- C++explicit关键字
- 【C++】explicit关键字
- C++explicit关键字
- 【C++】explicit关键字
- 【C++】explicit关键字
- 【C++】explicit关键字
- C++关键字之explicit
- C++关键字之explicit
- c++关键字之explicit
- C++关键字之:explicit
- C++关键字之explicit
- C++关键字之explicit
- C++关键字之explicit
- C++笔记之关键字explicit
- C++——explicit关键字简析
- extern “C”总结 C++中的explicit关键字
- C++—volatile、explicit、mutable关键字
- 20个高级Java面试题汇总
- Chrome隐私设置错误,您的链接不是私密连接
- LDA and QDA
- 用java以正确的姿势刷CSP
- python入门(2)
- C++关键字之explicit
- 真实实践中的MeritMS与Project Wise的校审流程对比
- 超详细的系统时钟和定时器原理解析
- 【拜小白opencv】43-形态学滤波——综合示例【腐蚀、膨胀、开运算、闭运算、顶帽、黑帽 形态学梯度、内部梯度、外部梯度、X方向梯度、Y方向梯度】
- Bzoj3998 弦论
- JVM--详解类加载机制
- Android混淆机制
- 返回栈上的对象、对象的引用及各构造器发生的时机
- 自顶向下,逐步求精----计算机哲学