C++笔记之关键字explicit
2016-05-12 22:02
459 查看
在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。
explicit使用注意事项:
explicit 关键字只能用于类内部的构造函数声明上。
explicit 关键字作用于单个参数的构造函数。
隐式转换:直接将一种类型赋值给另外一个类型;
例如:string strType = “123”;
object objType=strType;//,隐式转换,
显示转换:数据先进行类型转换再进行赋值,
例如:string strType = “123”;
object objType=(object)strType;//,显式转换,
http://www.cnblogs.com/this-543273659/archive/2011/08/02/2124596.html
explicit使用注意事项:
explicit 关键字只能用于类内部的构造函数声明上。
explicit 关键字作用于单个参数的构造函数。
隐式转换:直接将一种类型赋值给另外一个类型;
例如:string strType = “123”;
object objType=strType;//,隐式转换,
显示转换:数据先进行类型转换再进行赋值,
例如:string strType = “123”;
object objType=(object)strType;//,显式转换,
**例子: ***转自:***
http://www.cnblogs.com/this-543273659/archive/2011/08/02/2124596.html
未加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. } 加了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. } **
相关文章推荐
- 【C/C++】:如何获得一个float数的小数位数?
- C++中类和结构体的介绍
- 第7周 C语言程序设计(新2版) 练习1-17 打印长度大于80个字符的所有输入行
- C语言学习021:管道
- C++学习笔记(1) —— 有关在函数参数表后的const
- C++11新特性学习笔记(二)
- 【C++】:C++ STL中的map 详解
- 【C++】:C++中map的使用
- c++ 左值与右值
- 二分K均值c++实现
- 335. Self Crossing(C++实现)
- knn算法C++实现
- C语言之sprintf()字符串的构造
- C/C++中const关键字详解
- C++ 类的静态成员详细讲解
- 《离散数学》用C++实现第二类Stirling数的递归与(非递归)递推的方法 ,并且在实现了s(n-k)=S(n-1,k-1)+k*S(n-1,k)用递归、非递归方式之后,比教两个实验的调试速度、耗时
- 多连块(c++ 模拟法)
- C++对象内存模型
- 单循环链表(C语言实现)
- PAT (Basic Level) Practise (中文)1042. 字符统计(20)