文档章节

explicit作用

 野渡书生
发布于 2016/05/10 10:17
字数 494
阅读 15
收藏 0

在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。

explicit使用注意事项:

    explicit 关键字只能用于类内部的构造函数声明上;

    explicit 关键字作用于单个参数的构造函数。

    在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,例子:

(1)未加explicit时的隐式类型转换

   1. class Circle  
   2. {  
   3. public:  
   4.     Circle(double r) : R(r) {}  
   5.     Circle(int x, int y = 0) : X(x), Y(y) {}  
   6.     Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {}  
   7. private:  
   8.     double R;  
   9.     int    X;  
  10.     int    Y;  
  11. };  
  12.   
  13. int _tmain(int argc, _TCHAR* argv[])  
  14. {  
  15. //发生隐式类型转换  
  16. //编译器会将它变成如下代码  
  17. //tmp = Circle(1.23)  
  18. //Circle A(tmp);  
  19. //tmp.~Circle();  
  20.     Circle A = 1.23;   
  21. //注意是int型的,调用的是Circle(int x, int y = 0)  
  22. //它虽然有2个参数,但后一个有默认值,任然能发生隐式转换  
  23.     Circle B = 123;  
  24. //这个算隐式调用了拷贝构造函数  
  25.     Circle C = A;  
  26.       
  27.     return 0;  
  28. } 

(2)加了explicit关键字后,可防止以上隐式类型转换发生

   1. class Circle  
   2. {  
   3. public:  
   4.     explicit Circle(double r) : R(r) {}  
   5.     explicit Circle(int x, int y = 0) : X(x), Y(y) {}  
   6.     explicit Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {}  
   7. private:  
   8.     double R;  
   9.     int    X;  
  10.     int    Y;  
  11. };  
  12.   
  13. int _tmain(int argc, _TCHAR* argv[])  
  14. {  
  15. //一下3句,都会报错  
  16.     //Circle A = 1.23;   
  17.     //Circle B = 123;  
  18.     //Circle C = A;  
  19.       
  20. //只能用显示的方式调用了  
  21. //未给拷贝构造函数加explicit之前可以这样  
  22.          Circle A = Circle(1.23);  
  23.         Circle B = Circle(123);  
  24.         Circle C = A;  
  25.   
  26. //给拷贝构造函数加了explicit后只能这样了  
  27.          Circle A(1.23);  
  28.         Circle B(123);  
  29.         Circle C(A);  
  30.     return 0;  
  31. } 

 

© 著作权归作者所有

共有 人打赏支持
上一篇: 死锁(deadlocks)
下一篇: 字符个数统计
粉丝 9
博文 217
码字总数 158821
作品 0
南京
私信 提问
C++类型转换操作符(type conversion operator)

类型转换操作符operator type(),是不同于重载()操作符operator()()的,更不同于类构造函数 classname() 类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类...

lieefu
2015/12/27
81
0
Boolan微专业:C++第四周学习笔记

本周课程思维导图 1.模板偏特化之个数的偏 模板多个参数,已提前绑定一个。以下两个模板要同时存在。 注意:绑定模板参数必须从左边顺序绑定,不能出现跳跃绑定! 2.模板偏特化之范围的偏 以...

逗之煞
2017/11/12
0
0
【C++】关键字explicit的作用

简单的讲,关键字explicit可以禁止单参构造函数被用于自动类型转换。 看个单参构造函数用于自动类型转换的例子: #include <iostream> using namespace std; class Stack{public: private: ...

恋恋美食
2011/12/11
0
0
区分一下强制类型转换运算符重载/赋值运算符重载/对象定义的赋值

这三个名字可能很绕,看着也很不一样,但其实是三个很容易混淆的概念,并且经常在实际编程中遇到。这里拿出来比较一下。 首先是强制类型转换运算符的重载,作用是当前对象向其他类型的转换,...

Shawphy
2012/05/08
0
3
Python import中相对路径的问题

从查到的资料来看,关于import路径的来说,分成3类: absolute import import xml import youpackage.xml from youpackage import xml 这几种都算绝对路径 relative import import xml 从这个...

Honghe
2012/12/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

防御CSRF攻击

跨站请求伪造(CSRF)是一种安全漏洞,攻击者利用受害者的 session 来通过受害者的浏览器发出请求。攻击者通过受害者的浏览器发送请求,并伪造成是受害者自己发出的请求。 建议你先熟悉CSRF,...

Landas
28分钟前
1
0
【双12首发】终于等来了!PhalApi-iView-admin 开源后台框架

PhalApi-iView-admin 开源后台框架 码云地址:https://gitee.com/dogstar/phalapi-iview-admin Github地址:https://github.com/phalapi/phalapi-iview-admin 主要采用的技术: PhalApi 开源......

暗夜在火星
29分钟前
1
0
JavaScript面试题大坑之隐式类型转换实例代码

1.1-隐式转换介绍 在js中,当运算符在运算时,如果两边数据不统一,CPU就无法计算,这时我们编译器会自动将运算符两边的数据做一个数据类型转换,转成一样的数据类型再计算 这种无需程序员手...

peakedness丶
31分钟前
0
0
示例vue 的keep-alive缓存功能的实现

本篇文章主要介绍了vue 的keep-alive缓存功能的实现,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 #Vue 实现组件信息的缓存 当...

前端攻城老湿
32分钟前
2
0
解析Vue.js中的computed工作原理

我们通过实现一个简单版的和Vue中computed具有相同功能的函数来了解computed是如何工作的。写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批...

前端攻城小牛
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部