当前位置: 首页 > news >正文

[Effective C++]条款27:尽量少做转型动作

.
C++中,转型(cast)技术是将一种数据类型转换为另一种数据类型的过程。C++主要提供了两种主要的转型方式:旧式的C转型方式和四种新式的C++转型方式。
1、旧式C转型方式

  • 特点:语法简介,可执行数值类和指针类型转换,但是缺乏类型安全检查,并且代码可读性较差
语法:
(type) expression;

例子:
int a = 10;
double b = (double)a;

2、C++新式转型方式
2.1、const_cast(expression);

  • 主要用于添加或移除const或volatile修饰符,不能用于类型转换
const int a = 10;
int* b = const_cast<int*>(&a);  // 移除const修饰符

2.2、dynamic_cast(expression);

  • 主要用于继承体系中进行安全的向下转型,即从基类指针或引用转换为派生类指针或引用
  • 内部采用运行时类型信息(RTTI)实现,性能开销较大。
  • 在转换时进行类型安全检查,如果转换失败返回nullptr或抛出异常
class Base { virtual void foo() {} };
class Derived : public Base {};

Base* b = new Derived;
Derived* d = dynamic_cast<Derived*>(b);  // 安全的向下转型

2.3、reinterpret_cast(expression);

  • 用于低级别的类型转换,通常用于指针类型之间的转换或整数与指针之间的转换
int a = 10;
int* p = &a;
char* c = reinterpret_cast<char*>(p);  // 将int指针转换为char指针

2.4、static_cast(expression);

  • 用于常见的类型转换对于向下转型,不进行运行时检查
double a = 10.5;
int b = static_cast<int>(a);  // 浮点数转整数

Base* base = new Derived;
Derived* derived = static_cast<Derived*>(base);  // 向下转型

3、运行时类型信息(RTTI)

  • RTTI是C++提供的一种机制,允许程序在运行时获取对象的类型信息。
  • RTTI依赖于编译器为多态类型(虚函数表)生成额外的类型信息,在虚表中存储了一个type_info对象的指针,用于描述类型信息的类。
  • 当使用dynamic_cast进行类型转换时,编译器会生成代码,通过对象的虚表指针查找type_info对象,检查目标类型与对象的实际类型是否兼容(是否是基类或派生类)
class Base {
public:
    virtual void foo() {}  // 必须是多态类型(包含虚函数)
};

class Derived : public Base {};

Base* base = new Derived;

// 使用 dynamic_cast 进行向下转型
Derived* derived = dynamic_cast<Derived*>(base);
if (derived) {
    std::cout << "转型成功!" << std::endl;
} else {
    std::cout << "转型失败!" << std::endl;
}

思维导图笔记:
请添加图片描述

相关文章:

  • VMware-workstation-full-12.5.2 install OS X 10.11.1(15B42).cdr
  • 安卓ConstraintLayout + Barrier 实战:让 TextView 动态宽度但不超过另一个控件
  • QT ARM 开发环境搭建
  • 深度解析LinkedList工作原理
  • 一个极简的反向传播实现
  • 【数据分享】1999—2023年地级市地区生产总值及一二三产构成数据(Shp/Excel格式)
  • 快速排序笔记
  • 16、Swift框架微调实战(1)-自我认知数据LORA微调
  • 基于大模型的病态窦房结综合征预测及治疗方案研究报告
  • 【Git “rev-parse“ 命令详解】
  • Redis的常用数据结构
  • 【数学建模】描述统计量与常见概率分布:从理论到实践的深度解析
  • I/O进程1
  • pydantic.error_wrappers.ValidationError: 1 validation error for Lockfile
  • 算法题(119):高精度减法
  • Linux基础IO(一)之回顾C语言文件接口
  • Base64是密码吗?编码与加密的本质区别
  • 2018年真题
  • Java 三大特性—多态
  • 海外直播平台交互设计师简历模板
  • 百年前淮北乡村的风俗画卷——读郑重 《九十自述》
  • 破题“省会担当”,南京如何走好自己的路?
  • 萨洛宁、康托罗夫、长野健……7月夏季音乐节来很多大牌
  • 新四军老战士、苏州市文联原副主席张景坤逝世
  • 技术派|台军首次试射“海马斯”火箭炮,如何压制这种武器?
  • 外交部:将持续便利中外人员往来,让“中国游”金字招牌更加闪耀