文档章节

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. } 

 

© 著作权归作者所有

共有 人打赏支持
粉丝 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
区分一下强制类型转换运算符重载/赋值运算符重载/对象定义的赋值

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

Shawphy
2012/05/08
0
3
【C++】关键字explicit的作用

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

恋恋美食
2011/12/11
0
0
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

没有更多内容

加载失败,请刷新页面

加载更多

活动招募 HUAWEI HiAI公开课·北京站-如何在4小时把你的APP变身AI应用

人工智能和机器学习是全球关注的新趋势,也是当前最火爆、最流行的话题。当你拿手机用语音助手帮你点外卖,智能推荐帮你把周边美食一网打尽;当你拿起P20拍照时,它将自动识别场景进行最美优...

华为终端开放实验室
30分钟前
1
0
匹配两位小数,js正则

var regex = /^\d*(\.[1-9]|\.\d[1-9])*$/ console.log(1.2,regex.test(1.2)); console.log(0.3,regex.test(0.3)); console.log(1.03,regex.test(1.03)); ......

微信小程序-暗潮
35分钟前
1
0
905. Sort Array By Parity - LeetCode

Question 905. Sort Array By Parity Solution 题目大意:数组排序,偶数放前,奇数在后,偶数的数之间不用管顺序,奇数的数之间也不用管顺序 思路:建两个list,一个放偶数,一个放奇数,最...

yysue
40分钟前
1
0
h5 禁止手机自带键盘弹出

html: <div style="width: 350px;margin:50px auto;"><input type="text" id="datePicker" class="date_picker form-control" placeholder="点击选择入住日期" /></div> js: $("#date......

Delete90
57分钟前
1
0
color透明度对照表

透明度百分比 数值 100% 不透明 FF 95% F2 90% E6 85% D9 80% CC 75% BF 70% B3 65% A6 60% 99 55% 8C 50% 80 45% 73 40% 66 35% 59 30% 4D 25% 40 20% 33 15% 26 10% 1A 5% 0D 0% 完全透明 ......

_无问西东
58分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部