数据类型转换 隐式数据类型转换 显式数据类型转换 static_cast:内置数据类型向下转换 const_cast:去除常指针常引用 reinterpret_cast:重新解释类型,不改变bit dynamic_cast:基类与派生类动态绑定的转换 4.1隐式数据类型转换 逻辑运算操作结果必须为bool 非0转换为true,0转换为false 位运算操作数必须是整数 字节数少的转换为字节数多的类型 赋值运算一律将右值转换为左值 4.2显示数据类型转换 C语言的数据类型转换很简单 TYPEb=(TYPE)a; C++的类型转换提供更好的控制强制转换过程,允许控制各种不同种类的强制类型转换 4.2.1static_cast 静态转换:可以实现内置基本数据类型之间的转换 TYPEb=static_cast 只能在有联系的类型之间相互转换 不一定包含虚函数 在编译时进行转换 用于基类和子类之间转换 子类指针转换成父类指针是安全的 父类指针转换成子类指针是不安全的 基本数据类型转换 把空指针转换成目标类型的空指针 把任何类型的表达式转换成void类型 inta=6;doubleb=static_cast 4.2.2const_cast 常量转换:用于取出常指针或常引用的const属性(把const指针转换为非const指针) 不能转换不同类型的白能量 只能用于指针或常引用 在编译时转换 constinta=0;intb=const_cast 4.2.3reinterpret_cast 重新解释转换:不同类型的指针类型转换 操作结果只是简单的从一个指针到别的指针的值拷贝 指针,引用,算法类型,函数指针或成员指针 编译时 用于多态类,函数指针类型之间的转换 /*reinterpret_cast把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。*/int*ip;char*pc=reinterpret_cast 在比特级别进行转换。将一个指针转换成一个整数,也可以把一个整数转换成一个指针,只能将32bit实例转换成指针 intdoSomething{return0;}typedefvoid(*FuncPtr);//FuncPtr一个函数指针,没有参数,返回值类型为voidFuncPtrfuncPtrArray[10];funcPtrArray[0]=&doSomething;//编译错误:类型不匹配funcPtrArray[0]=reinterpret_cast 4.2.4dynamic_cast 动态转换:转换成功,则返回类的指针或引用,失败则返回null 不能用于内置基本类型的强制转换 运行时进行类型安全检查 安全的基类和子类转换 上行转换时,动态转换和静态转换效果相同 下行转换时,动态转换具有类型检查功能,更安全 使用动态转换,基类(抽象类)中一定要有虚函数 相同基类不同子类之间的交叉转换,但结果是NULL classBaseClass{public:intnum;virtualvoidfun{};};classDerivedClass:publicBaseClass{public:char*name[10];voidbar{};};//上行转换BaseClass*pb=newDerivedClass;DerivedClass*pb1=static_cast |
|