博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中的类型转换
阅读量:7106 次
发布时间:2019-06-28

本文共 1192 字,大约阅读时间需要 3 分钟。

和goto语句一样类型转换的名声似乎也是不那么好。

不过类型转换在某些紧要关头就显得尤为重要,看看现有的C/C++代码就知道,以至于你不理解转换的作用,代码将是无法阅读的。
就像铀,它能变成原子弹,但它也能用来发电,是灾难还是福祉那就要看人类了。
显然类型转换默默承受着这不公的一切。
不管怎么说C风格的类型转换还是不尽人意的:
1.它们很粗糙,你可以通过它们在任意类型之间进行转换,没有明确指定每个转换的目的。
2.C风格的类型转换很难进行查找。它们是由一对括号加上一个类型标识组成的,而括号和类型标识在C++里到处都是。
C++通过引进4种类型的类型转换操作符克服了C风格的类型转换的缺点。
static_cast
const_cast
dynamic_cast
reinterpret_cast
关于这些操作符应该知道的是,你习惯的写法:
(type) expression
现在都应该写成
static_cast<type>(expression)
它与C风格的类型转换有同样的限制,例如不能把结构(struct)转换成int,不能把double转换成指针。
const_cast是用来去掉一个表达式的const属性或者volatile属性(至于volatile在C++中的含义可以google一下便知道)
dynamic_cast用来对一个继承体系做向下或者横向的安全转换,也就是把基类的指针(引用)转换成派生类或者基类的兄弟类指针(引用),很重要的一点可以知道转换是否成功。空指针,异常(引用)意味着转换失败。
dynamic_cast仅限于用来操纵继承体系。而最后一种
reinterpret_cast最常见的用法就是用来在函数指针之间进行类型转换。
typedef void (*FuncPtr)();
FuncPtr funcPtrArray[10];
int doSomething();
funcPtrArray[0] = &doSomething;//错误,类型不匹配
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);
把上面这个函数的指针放入funcPtrArray中,如果不进行类型转换就不可能办到。
C++新的类型转换既难看又难输入(这个很大程度上是设计者故意的,因为可以迫使使用者尽量不进行类型转换),但是C风格的类型转换仍然可用。正因为新的类型转换缺少美感,使得它有着确切的含义并且容易识别。
<<More Effective C++>>的作者Scott Meyers强烈建议使用新的类型转换运算符,这些C++大师的建议应该是值得采纳的。

转载于:https://www.cnblogs.com/xubin0523/archive/2012/10/15/2725214.html

你可能感兴趣的文章
iTextSharp快速使用指南
查看>>
C语言(1+1+2+1+2+3....+n)
查看>>
浅谈 js 字符串 search 方法
查看>>
WPF设置样式的几种方式
查看>>
activity的onCreate参数 saveInstanceState
查看>>
css调整图片位置布局
查看>>
华为的JAVA面试题及答案(部分)
查看>>
定时关机命令——shutdown
查看>>
基于Java的数据采集(三)
查看>>
【编程题目】最长公共字串
查看>>
lucene 专业名词作用整理
查看>>
win32 自定义右键菜单
查看>>
excel 数字转文本
查看>>
WPF 回车转Tab实现跳转
查看>>
Cocos2d-x3.0TestCpp文件夹笔记(二)
查看>>
CentOS-6.5安装配置Tengine
查看>>
机器视觉之 ICP算法和RANSAC算法
查看>>
关于Json-lib类库的使用
查看>>
为什么GOF的23种设计模式里面没有MVC?
查看>>
[WebGL入门]十,矩阵计算和外部库
查看>>