1.隐式类型转换的问题

隐式类型转换是 C++ 一个让人又爱又恨的特性,使用方便,但可能会降低代码可读性,甚至会造成一些十分隐晦的错误。

#include <iostream>
using namespace std;class MyInt
{
public://单参构造函数explicit MyInt(int value) :_value(value){}//类型转换操作符operator bool() const noexcept{return _value != 0;}//加运算符重载MyInt& operator+(const MyInt& right){_value += right.getValue();return *this;}int getValue() const{return _value;}
private:int _value;
};int main()
{MyInt myInt1(1);MyInt myInt2(2);cout << "myInt1+myInt2=" << myInt1 + myInt2 << endl;return 0;
}

程序编译运行输出:

myInt1+myInt2=1

虽然程序编译运行没有什么问题,但是两个 MyInt 对象相加的结果并不是我们期望的数值 3,而是 1,导致这种隐晦错误的原因是在两个 MyInt 对象相加后,结果对象 myInt1 由于没有合适的输出操作符函数 operator<<() 将其输出,被隐式地转换为 bool 类型,导致输出数值为 1。随着项目代码规模变大,这种由隐式类型转换导致的隐晦错误会越埋越深,越来越难以发现。

2.显示类型转换的实现

为了阻止容易导致隐晦错误的隐式类型转换,C++11引入了 explicit 关键字作用于自定义的类型转换操作符,禁止隐式类型转换。其用法类似于explicit 作用于单参构造函数来避免单参数构造函数被隐式调用造成的隐式类型转换。

//类型转换操作符
explicit operator bool() const noexcept
{return _value != 0;
}cout << "myInt1+myInt2=" << myInt1 + myInt2 << endl; //编译出错

当使用 explicit 关键字修饰 bool 类型转换操作符时,隐式类型转换将会被阻止,进而引起上面的编译错误,将潜在的隐晦错误暴露于编译阶段,让错误得以提前发现,提前解决。

注意,显式类型转换有一个例外。如果表达式被用作条件,仅限转换到bool,那么显式的 operator bool() 也可以隐式地进行。“被用作条件”指出现在以下语句:
(1)if、while 及 do 语句的条件部分;
(2)for 语句头的条件表达式;
(3)逻辑非运算符(!)、逻辑或运算符(||)、逻辑与运算符(&&)的运算对象;
(4)条件运算符(x ? y : z)的条件表达式。

由于转换到 bool 一般被用作条件,而不应该被用于数值运算,所以operator bool() 一般用 explicit 来修饰。


参考文献

[1] 深入理解C++11[M].C3.4显示转换操作符.P89-P92
[2]【C++11】显式转换操作符

C++11 显示类型转换相关推荐

  1. 《Python语言程序设计》——2.11 类型转换和四舍五入

    本节书摘来自华章计算机<Python语言程序设计>一书中的第2章,第2.11节,作者:[美]梁勇(Y. Daniel Liang) 更多章节内容可以访问云栖社区"华章计算机&qu ...

  2. c语言float转换为int_C语言的隐式类型转换和显示类型转换

    C语言是一种强类型语言,当使用一种类型的对象代替另外一种类型的对象进行操作时,必须首先进行类型转换. 类型转换的方式,一般可分为隐式类型转换和显示类型转换(也称为强制类型转换). 1.隐式类型转换 隐 ...

  3. 显示类型转换和隐式类型转换

    显示类型转换 1.Number():函数把对象的值转换为数字,如果对象的值无法转换为数字,那么 Number() 函数返回 NaN. var a = 'true';console.log(typeof ...

  4. iphone 11显示连接服务器出现错误,iPhone11投屏方法有哪些?iPhone投屏失败的原因及解决方法...

    对于iPhone投屏方法有些网友们并不了解,而且有些小伙伴出现了投屏失败的情况.为了让大家更好的了解iPhone投屏方法,智能手机网就为大家带来了iPhone投屏方法与失败解决方案的具体信息,一起来瞧 ...

  5. java什么是显示类型转换_【Java的显示转换方法是什么?这种数据类型转换就要这样操作】- 环球网校...

    [摘要]数据类型转换,有助于开发者和用户之间的交流,我希望大家一定要了解Java的显示转换方法是什么?这种数据类型转换就要这样操作,今天小编就带大家看看Java的显示转换方法是什么?这种数据类型转换就 ...

  6. 最新资讯:iPhone 11显示模块更换计划,用于解决触摸问题

    12月5日消息,日前,苹果在官网公告中加入了一项针对 iPhone 11 的全球维修服务计划.这是因为苹果表示部分在 2019 年 11 月至 2020 年 5 月之间制造的设备会出现停止响应触摸的问 ...

  7. windows10/11显示需要提供要在幻灯片放映中的显示的多张图片

    目录 问题如图​ 具体步骤 注意事项 不清楚重启文件资源管理器的,看过来 问题如图 前言                                                        ...

  8. Android 11 显示状态与背光亮度调整

    Power状态更新 主要在PowerManagerService.java,根据系统状态更新下次update的时间,遍历wakelock状态更新显示状态等 一.函数updatePowerStateLo ...

  9. 苹果11显示无法连接服务器,iOS 11无法连接App store怎么办 iOS 11 App store无法连接怎么办...

    有不少抢先体验了iOS 11系统的用户发现,自己的设备在升级到iOS 11系统之后,出现了App store无法连接的情况.打开App store就是一片空白或者无限转圈圈.那么iOS 11无法连接A ...

最新文章

  1. SQL 2000自定义函数调用GETDATE()报错
  2. gsoap写一个c++ webservice
  3. static_cast, dynamic_cast, const_cast探讨【转】
  4. photon mapping学习笔记
  5. 001 初学android开发,从搭建环境开始(jdk+eclipse+android sdk+windows7)
  6. 华为HG255D路由破解方法
  7. 更换卡巴斯基6授权许可文件的方法
  8. 第58章、拍照功能实现(从零开始学Android)
  9. libsvm多分类python_LIBSVM (三) 葡萄酒种类识别
  10. linux c 开发 英文简历,软件工程师英文简历范文
  11. html如何设置hr 标签的线条粗细,设置hr标签的粗细
  12. PPT居然还可以一键换色!学会这4招再也不怕色了……
  13. 设计一款给爸爸妈妈用的手机
  14. ROS从入门到精通0-2:ROS简介、安装与常见问题
  15. 英文标点符号unicode
  16. 小程序登录授权code
  17. linux/android驱动工程师面试相关内容总结
  18. 深度学习磁共振图像超分与重建论文阅读
  19. 使用vagrant工具来管理和创建虚拟机
  20. ios 拨打电话系统回调函数

热门文章

  1. Facebook Messenger 被曝漏洞,可导致恶意软件获得持续访问权限(详细分析)
  2. GitHub 2019年漏洞奖励计划最值得回顾的2个精彩 bug
  3. 刚刚修复的Windows 0day和Chrome 0day 已被组合用于 WizardOpium 攻击(详解)
  4. 成都睿铂x云南省地矿测绘院:丽江玉龙高精度地籍免像控案例分享
  5. [SAP ABAP开发技术总结]ABAP调优——代码优化
  6. 新练习作,实验室网站首页——未采用
  7. GridView的RowCommand事件中取得行索引 技巧
  8. java字符串怎么拼接字符串_Java中String使用+ 拼接字符串的原理是什么?
  9. acm java输入输出_ACM中java如何快速输入输出
  10. 【软件测试】白盒测试的条件覆盖标准强于判定覆盖(错)