本帖最后由 baizy77 于 2018-10-1 20:48 编辑
版权声明 --------------------------------------------------------------------------------------------------------------------- 作者: 女儿叫老白 (白振勇) 转载请注明出处! --------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------
引言 ----------------------------------------------------------------------------- 很多老中医虽然行医多年但是有时也会犯些低级错误,而且从来没有意识到自己犯错误。一些编程老鸟也是如此,习惯性的使用强制类型转换。这可是简单粗暴的编程方式,不值得推荐。今天我们就来看一下怎么解这种简单粗暴。
正文 ----------------------------------------------------------------------------- (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!
|