gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章C++11显示类型转换的优点由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

1.隐式类型转换的问题 。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#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被隐式地转换为bool类型,导致输出数值为1。随着项目代码规模变大,这种由隐式类型转换导致的隐晦错误会越埋越深,越来越难以发现.

2.显示类型转换 。

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

?
1
2
3
4
5
6
7
//类型转换操作符
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来修饰.

以上就是C++11显示类型转换的优点的详细内容,更多关于C++11显示类型转换的资料请关注我其它相关文章! 。

原文链接:https://cloud.tencent.com/developer/article/1378999 。

最后此篇关于C++11显示类型转换的优点的文章就讲到这里了,如果你想了解更多关于C++11显示类型转换的优点的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com