• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

C++11显示类型转换的优点

c++ 搞代码 4年前 (2022-01-06) 38次浏览 已收录 0个评论

这篇文章主要介绍了C++11显示类型转换的优点,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下

1.隐式类型转换的问题

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

 #include  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被隐式地转换为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语句的条件部分;来源gaodai$ma#com搞$代*码*网
 (2)for语句头的条件表达式;
 (3)逻辑非运算符(!)、逻辑或运算符(||)、逻辑与运算符(&&)的运算对象;
 (4)条件运算符(x ? y : z)的条件表达式。

由于转换到bool一般被用作条件,所以operator bool()一般用explicit来修饰。

以上就是C++11显示类型转换的优点的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C++11显示类型转换的优点

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址