码迷,mamicode.com
首页 > 编程语言 > 详细

恶补C++ 之 类型转换

时间:2014-11-28 18:30:42      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:c++ 类型转换

        类型转换,在程序设计中是令人鄙视,无法忍受的存在,但是在某些时候,类型转换又是必须的。

        在C语言中,类型转换经常用圆括号和一些标识符组成,但是这种转换形式很不容易被发现,在阅读上也造成了一定的困难。

        在C++中,虽然也兼容老式的C语言转换风格,但是更推荐使用C++风格的类型转换:static_cast,

const_cast, dynamic_cast, reinterpret_cast。对于这四种类型转换的用法,我将对自己恶补一下。

        首先是 static_cast,功能上基本与C风格的类型转换一样强大,所以基本上不知道怎么用类型转换的时候,就可以使用它。

            1)用于基本数据类型之间的转换,如把int转换成char, 把int转换成double等。

            2)把空指针转换成目标类型的空指针。

            3)把任何类型的表达式转换成void类型。

            注意:static_cast不能转换掉expression的const,volatile,或者__unaligned属性。

        其次是 const_cast,它的用途基本上可以直接理解为转换掉对象的const属性。

        再次是 dynamic_cast它被用于安全地沿着类的继承关系向下进 行类型转换。这就是说,你能用 dynamic_cast 把指向基类的指针或引用转换成指向其派生 类或其兄弟类的指针或引用,而且你能知道转换是否成功。失败的转换将返回空指针(当对 指针进行类型转换时)或者抛出异常(当对引用进行类型转换时) 。

        最后是 reinterpret_cast,最普通的用途就是在函数指针类型之间进行转换 。例如:

            typedef void (*FuncPtr)();     // FuncPtr是指向函数的指针,没有参数,返回类型为void

            FuncPtr funcPtrArray[10];      // funcPtrArray 能容纳10个FuncPtr的数组。

            int doSomething();            // 处于某些奇葩因素,想要转换的函数。


            funcPtrArray[0] = &doSomething; // 错误!类型不匹配 

            funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);     // 正确

        注意:转换函数指针的代码是不可移植的(C++不保证所有的函数指针都被用一样的方法表

示),在一些情况下这样的转换会产生不正确的结果 


        以上是我对四种类型转换的一个解读,如果有错误的地方,还请各位大神们帮忙纠正。














本文出自 “Jimmy恶补C++” 博客,请务必保留此出处http://jimmystar.blog.51cto.com/3716199/1584072

恶补C++ 之 类型转换

标签:c++ 类型转换

原文地址:http://jimmystar.blog.51cto.com/3716199/1584072

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!