找回密码
 立即注册
收起左侧

C++老鸟日记013 显示类型转换

2
回复
4904
查看
[复制链接]
累计签到:41 天
连续签到:1 天
来源: 原创 2018-9-5 17:54:14 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 baizy77 于 2018-10-1 20:48 编辑

版权声明
---------------------------------------------------------------------------------------------------------------------
该文章原创于Qter开源社区(www.qter.org
作者: 女儿叫老白 (白振勇)
转载请注明出处!
---------------------------------------------------------------------------------------------------------------------
本套课程属于:《C++跨平台开发干货》系列课程。
-----------------------------------------------------------------------------

引言
-----------------------------------------------------------------------------
       很多老中医虽然行医多年但是有时也会犯些低级错误,而且从来没有意识到自己犯错误。一些编程老鸟也是如此,习惯性的使用强制类型转换。这可是简单粗暴的编程方式,不值得推荐。今天我们就来看一下怎么解这种简单粗暴。

正文
-----------------------------------------------------------------------------
(3.7.12)
说到显示类型转换,我们先提一下隐式类型转换。啥叫隐式类型转换?实际我们经常用到,
比方说,一个接口需要float类型的参数,我们给它传一个int,编译器就要负责将int类型隐式转换为float再用。
       又比如,存在父子派生关系的两个类CParent(父类)、CChild(子类)。如果一个接口需要CParent类型的参数,但是我们传了一个CChild类型的对象,编译器就会将对象隐式转换为CParent,调用CParent的构造函数并生成一个临时对象传给函数。代码如下:
       //header.h
string getName(CParentobj);

       //a.cpp
       intmain(int argc, char* argv[])
{
       CChild obj;
       string  strName = getName(obj);      // 编译器会将obj隐式转换为CParent
       }

       所谓显示类型转换,就是用明确的语法告诉编译器,我要进行类型转换。有的同志不太守规矩,喜欢玩暴力,直接用强制类型转换。比如:
       CClassA* pObjA;
       ……
       CClassB*pObjB = (CClassB*)pObjA;
       pObjB->function();
       这样的语句很有可能导致异常,尤其是两个类型的成员有地址偏差的时候,将会导致程序崩溃。
       正确的写法应该是:
       CClassB*pObjB = dynamic_cast<CClassB*>(pObjA);
       if(NULL != pObjB) {
              ……
}
而且,也请避免采用 if (pObjB)这样的语句对指针进行判断。看上去比较业余。
经常看到很多老员工都不太注意编码规范,哎……

static_cast是经常用到的转换方法。这里要注意对void*类型的指针进行转换的问题。使用void*指针进行转换是比较危险的行为,应尽量避免这样的设计。
// a.cpp
int  i= 0;
void *p = &i;
float *fp =static_cast<float*>(p); // dangerous!

回复

使用道具 举报

累计签到:50 天
连续签到:1 天
2018-9-6 22:58:48 显示全部楼层
// a.cpp
int  i= 0;
void *p = *i;
float *fp =static_cast<float*>(p); // dangerous!

大神上面的代码没有看懂,    void* P= &i 感觉是这样的?   为什么说是dangerous  ?  危险在哪里?

还有个问题问大神,    这里的static_cast与 dynamic_cast有什么样的区别?
回复 支持 反对

使用道具 举报

累计签到:41 天
连续签到:1 天
2018-9-7 09:05:41 显示全部楼层
您说的对,是我的笔误,应该是: void *p = &i;
危险是因为void* p指向了一个int类型的地址,而float *fp期望的是float类型,我们期望的是对fp指向的地址进行float数据写入或读取操作,而实际上这里是一个int数据。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了