从今天开始,对C++常用技术做个总结。
参考书籍:《C++Primer》、《C++对象模型》、《设计模式》、《Windows核心编程》、《STL解密》。
1. static_cast等四个cast的具体意义
C++类型转换:隐式转换和显式转换。
显式转换:static_cast、dynamic_cast、reinterpret_cast、const_cast。
1.1. static_cast
用法:static_cast<type-id>(expression)
说明:该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
来源:为什么需要static_cast类型强制转换?
(1)void指针->其他类型指针。
(2)改变通常的标准转换。
(3)避免出现可能多种转换的歧义。
几种用法:
(1)类层次中基类和子类之间指针或引用的转换。
进行上行转换(把子类的指针或引用转换成基类)是安全的。
进行下行转换(把基类的指针或引用转换成子类)时,由于没有动态类型检查,所以是不安全的。
(2)用于基本数据类型之间的转换,如把int转换成char等。
这种转换的安全性也要开发人员来保证。
(3)把void指针转换成目标类型的指针(不安全)。
(4)把任何类型的表达式转换成void类型。
1.2. dynamic_cast
用法:dynamic_cast<type-id>(expression)
说明:该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、引用或void*。
将基类类型的指针或引用安全地转换为派生类型的指针或引用。
一次执行两个操作。它首先验证被请求的转换是否有效,只有转换有效,操作符才实际进行转换。
流程图。
来源:为什么需要dynamic_cast?
简单来说,当无法使用virtual函数的时候。不能修改源码时,才这么干。
在类层次间进行上行转换时,dynamic_cast、static_cast的效果是一样的,在进行下行转换时,dynamic_cast是具有类型检查的功能。
1.3. reinterpret_cast
用法:reinterpret_cast<type-id>(expression)
说明:type-id必须是一个指针、引用、算术类型、函数指针或成员指针。
用法:它可以把一个指针转换成一个整数,或进行相反操作。
1.4. const_cast
用法:const_cast<type-id>(expression)
说明:该运算符用来修改类型的const或volatile属性。
常量指针或引用被转化成非常量指针或引用,并且仍然指向原对象。
常量对象被转换成非常量对象。
个人理解:个人不常用,这个用法违反了设计原意。
示例:
class B {public: int m_iNum;};
void foo(){
const B b1;
b1.m_iNum = 1000;//编译失败,因为b1是常量
B& b2=const_cast<B&>(b1);
b2.m_iNum=200;//fine,b1、b2的m_iNum值都为200
}