baizy77 发表于 2018-9-5 17:54:14

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

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

版权声明---------------------------------------------------------------------------------------------------------------------该文章原创于Qter开源社区(www.qter.org)作者: 女儿叫老白 (白振勇)转载请注明出处!---------------------------------------------------------------------------------------------------------------------课程目录:《C++老鸟日记》目录本套课程属于:《C++跨平台开发干货》系列课程。-----------------------------------------------------------------------------
引言-----------------------------------------------------------------------------       很多老中医虽然行医多年但是有时也会犯些低级错误,而且从来没有意识到自己犯错误。一些编程老鸟也是如此,习惯性的使用强制类型转换。这可是简单粗暴的编程方式,不值得推荐。今天我们就来看一下怎么解这种简单粗暴。
正文-----------------------------------------------------------------------------(3.7.12)说到显示类型转换,我们先提一下隐式类型转换。啥叫隐式类型转换?实际我们经常用到,比方说,一个接口需要float类型的参数,我们给它传一个int,编译器就要负责将int类型隐式转换为float再用。       又比如,存在父子派生关系的两个类CParent(父类)、CChild(子类)。如果一个接口需要CParent类型的参数,但是我们传了一个CChild类型的对象,编译器就会将对象隐式转换为CParent,调用CParent的构造函数并生成一个临时对象传给函数。代码如下:       //header.hstring getName(CParentobj);
       //a.cpp       intmain(int argc, char* argv[]){       CChild obj;       stringstrName = 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.cppinti= 0;void *p = &i;float *fp =static_cast<float*>(p); // dangerous!

tan 发表于 2018-9-6 22:58:48

// a.cpp
inti= 0;
void *p = *i;
float *fp =static_cast<float*>(p); // dangerous!

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

还有个问题问大神,    这里的static_cast与 dynamic_cast有什么样的区别?

baizy77 发表于 2018-9-7 09:05:41

您说的对,是我的笔误,应该是: void *p = &i;
危险是因为void* p指向了一个int类型的地址,而float *fp期望的是float类型,我们期望的是对fp指向的地址进行float数据写入或读取操作,而实际上这里是一个int数据。
页: [1]
查看完整版本: C++老鸟日记013 显示类型转换