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
}

原文地址:https://www.cnblogs.com/gcczhongduan/p/4301875.html