【C++11】显式转换操作符
来源:互联网 发布:python核心编程知乎 编辑:程序博客网 时间:2024/05/21 10:38
class X{public: operator int() const noexcept { return 42; }};void Func(int) {}int wmain(){ X x0; X x1; Func(x0); Func(x1); int n = x0 + x1; std::cout << n << std::endl; // 84 return 0;}
上面的代码中,X可以隐式地转换为int,于是函数Func可以接受X类型的参数,x0与x1也可以用+来做运算。
在实际的编程工作中,一个更常见的例子是,我们自己定义的字符串类(记为String)重载了operator const wchar_t*():
class String{public: operator const wchar_t*() const noexcept { // 函数体 }};
从而,如果一个函数需要const wchar_t*类型的参数,就可以直接传入一个String实例。
但是,重载类型转换也不是万无一失的。比如,重载operator bool()。
重载operator bool()所带来的问题比较多,以至于很多企业的编码规范中,都不提倡甚至禁止重载operator bool()。
由于bool属于算数类型,所以重载了operator bool()的类的实例可以被用在任何需要算术类型的上下文中。
class Y{private: int m_;public: explicit Y(int m) :m_{ m } {} operator bool() const noexcept { return (m_ != 0); }};int wmain(){ Y y0{ 12 }; Y y1{ 25 }; auto n = y0 + y1; // !!! std::cout << n << std::endl; return 0;}
毫无意义的y0 + y1竟然(无警告地)编译通过,而且还通过+产生了一个int,这实在不合理。可能程序作者想要的是Y(38),更可能的是后来维护代码的人根本无法知道原作者想干什么。随着代码的规模变大,这些细微的隐患会越埋越深,或许,将来花费两天时间找到的BUG就是由它引起的。
为了防止这样的异常情况,C++11引入了显式的类型转换运算符。
class X{public: explicit operator int() const noexcept { return 42; }};void Func(int) {}int wmain(){ X x0; Func(x0); // 错误,不存在从 X 到 int 的(隐式)转换 int y = x0; // 错误,不存在从 X 到 int 的(隐式)转换 Func((int)x0); // 正确1 Func(int(x0)); // 正确2 Func(static_cast<int>(x0)); // 正确3 return 0;}
用explicit修饰的类型转换运算符,则相应的类型转换必须显式地进行。C式(正确1),函数式(正确2),static_cast(正确3)都行。
但是,显式的类型转换有一个例外。如果表达式被用作条件,那么显式的operator bool()也可以隐式地进行(仅限转换到bool)。“被用作条件”即:
if、while及do语句的条件部分;
for语句头的条件表达式;
逻辑非运算符(!)、逻辑或运算符(||)、逻辑与运算符(&&)的运算对象;
条件运算符(x ? y : z)的条件表达式。
由于转换到bool一般被用作条件,所以operator bool()一般用explicit来修饰。
class K{public: explicit operator bool() const noexcept { return false; }};int wmain(){ K k0; if (k0) // 正确 { std::cout << "qwer" << std::endl; } else { std::cout << "zxcv" << std::endl; } return 0;}
- C++11显式转换操作符
- 【C++11】显式转换操作符
- 类型转换和操作符重载 (c#)
- C\C++类型转换操作符
- [C++][操作符]四种显示转换操作符
- C++11 FAQ中文版:显式转换操作符
- bool操作符需要显式转换。
- 《Effective C#》 Item 28: 避免使用类型转换操作符
- 《C++Primer》3.15重载操作符与转换
- 《c++primer》读书笔记三 重载操作符与转换
- c++Primer,十四,重载操作符与转换
- C++primer 5.4 赋值操作符(2.1 类型转换)
- C++类型转换操作符---补充(8)《Effective C++》
- [C++][基础]9_重载操作符和转换
- C++中的显式类型转换操作符
- 隐式类型转换与转换操作符operator T
- 隐式类型转换与转换操作符operatorT
- [C#]Datatable和json互相转换操作
- cocos2dx-lua捕获用户touch事件的几种方式
- 访问安卓系统注册表中音乐,图片,联系人信息的方法
- 查看某个目录占用空间
- 基于VCamera,仿微信录制短视频
- 【NOIP初赛】 计算机硬件
- 【C++11】显式转换操作符
- 十大实用的开源电子商务工具推荐
- Java多线程
- CSDN爬虫(五)——CSDN用户(所有)爬取+常用爬虫正则整理
- Android7.0适配教程,心得
- 使用RecylerView完成拖动排序,仿qq侧滑删除
- C++基础知识总结(一)
- 【bzoj 1191】[HNOI2006]超级英雄Hero 裸的二分图匹配
- 289. Game of Life