首页 > 代码库 > C++技术问题总结-第0篇

C++技术问题总结-第0篇

从今天开始,对C++常用技术做个总结。

参考书籍:《C++Primer》、《C++对象模型》、《设计模式》、《Windows核心编程》、《STL解密》。


1. static_cast等四个cast的具体意义

C++类型转换:隐式转换和显式转换。

显式转换:static_castdynamic_castreinterpret_castconst_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_caststatic_cast的效果是一样的,在进行下行转换时,dynamic_cast是具有类型检查的功能。


1.3. reinterpret_cast

用法:reinterpret_cast<type-id>(expression)

说明:type-id必须是一个指针、引用、算术类型、函数指针或成员指针。

用法:它可以把一个指针转换成一个整数,或进行相反操作。


1.4. const_cast

用法:const_cast<type-id>(expression)

说明:该运算符用来修改类型的constvolatile属性。

常量指针或引用被转化成非常量指针或引用,并且仍然指向原对象。

常量对象被转换成非常量对象。

个人理解:个人不常用,这个用法违反了设计原意。

示例:

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
}