2. 最好使用C++转型操作符
旧式的C转型方式,几乎允许你将任何类型转换为任何其它类型,有其自身的缺陷,表现在以下两方面:
不能更精确地指明其转型的意图。
如将一个pointer-to-base-class-object 转型为一个pointer-to-derived-class-object(改变一个对象的类型)和将一个pointer-to-const-object转型为一个pointer-to-non-const-object(改变对象的常量性),在旧式C语法中并不区分。
难以辨识。
旧式C转型方式的语法为(type)expression,由一对小括号加上一个对象名称组成,而这种语法结构在C++的任何地方都有可能使用,这就无法很直观地判断出是否是转型操作。
为解决上述的缺点,C++引入4个新型转型操作符,分别为:
static_cast, const_cast, dynamic_cast, reinterpret_cast
语法为: ***_cast<type> (expression).
下面着重解释四个新型操作符的用途:
static_cast: 基本与拥有与C旧式转型相同的威力与意义,以及相同的限制。如:
//计算两个int型数相除,结果为double型
int firstNum, secondNum;
double res = (double)firstNum / secondNum; //旧式C语法double res = static_cast<double>(firstNum) / secondNum; //新式C++转型符
const_cast: 用来改变表达式中的常量性(constness)或易变性(volatileness)。如:
int num;
const int *cpNum = #int *pNum = cpNum; //error:cannot convert from 'const int *' to 'int *'int *pNum = (int *)cpNum; //旧式Cint *pNum = const_cast<int *>(cpNum); //新式C++ const_cast移除常量性
dynamic_cast: 用来执行继承体系中“安全的向下转型或跨系转型动作”。如:
//可以利用dynamic_cast将“指向base class object 的pointer或reference”转型为“指向derived class object的pointer或reference”
//如果转型失败,会以一个null指针或一个exception 表现出来
class CBase { }; //基类class CDerived: public CBase { }; //继承类CDerived dc;CDerived *dp = &dc;CBase *bp = dynamic_cast<CBase *>(dp); //使用dynamic_cast将指向继承类的指针转化为指向基类的指针CBase &br = dynamic_cast<CBase &>(dc); //使用dynamic_cast将指向继承类的引用转化为指向基类的引用
reinterpret_cast: 最常用的用途是转换"函数指针"类型。如:
typedef void (*funcPtr)(); //funcPtr是个无参数返回值为void型的函数指针类型int iFunc(){return 0;} //iFunc为一个无参数返回值为int型的函数void func(funcPtr f){} //func函数的参数是一个类型为funcPtr类型的函数指针main(){func(iFunc()); //error:cannot convert parameter 1 from 'int' to 'void (__cdecl *)(void)'
func(reinterpre_cast<funcPtr>(iFunc); //right! reinterpre_cast将返回值为int 的函数转化为 返回值为void 的函数
}
邮箱:haifenglinying#yahoo.cn (#->@)
个人主页:www.hazirguo.com

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述