C++:类型转换(static_cast、reinterpret_cast、const_cast、dynamic_cast)、RTTI

news/2024/9/22 13:57:38/

C++:类型转换(static_cast、reinterpret_cast、const_castdynamic_cast)、RTTI

  • 一、C语言类型转换
  • 二、C++新增强制类型转换
    • 2.1 新增类型转换:static_cast
    • 2.2 新增类型转换: reinterpret_cast
    • 2.3 新增类型转换:const_cast
  • 2.4 新增类型转换:dynamic_cast
  • 三、 什么是RTTI

一、C语言类型转换

 在C中支持类型转换, 分为隐式类型转换和显示类型转换。但C中类型转换不是非常规范不规范,存在以下问题:

  1. 隐式类型转换:编译器在编译阶段自动转换。如果不能转换,编译失败。
  2. 显示类型转换:用户自己处理。

二、C++新增强制类型转换

 由于C语言两种类型转换方式都存在缺陷:隐式类型转换会导致诸如数据精度丢失等问题;而显示类型转化代码不清晰。所以C++在兼容C的基础之上,增加了4中强制类型转换:static_cast、reinterpret_cast、const_castdynamic_cast

static_cast_9">2.1 新增类型转换:static_cast

static_cast用于非多态的类型的转化,即静态转化。static_cast和C中的隐式类型转换类似,编译器会自动进行类型转换。如果不能转换,则编译失败!

int main()
{double d = 123.12l;int i = static_cast<int>(d);return 0;
}

2.2 新增类型转换: reinterpret_cast

reinterpret_cast对标的是C中的显示类型转换。需要注意的是显示类型转换通常会伴随风险,使用reinterpret_cast不会进行类型安全检查。

int main()
{int i = 3;//int* p = static_cast<int*>(i); //errorint* p = reinterpret_cast<int*>(i);return 0;

const_cast_34">2.3 新增类型转换:const_cast

const_cast用于去除变量的const属性,使变量能够进行赋值操作。
【实例】:

int main()
{const int i = 2;int* p = const_cast<int*>(&i);//删除常变量i的const属性(*p)++;//cout << i << ":" << *p << endl;printf("i=%d, *p=%d\n", i, *p);return 0;
}

在这里插入图片描述

  • 既然我们已经使用const_cast删除了变量iconst属性,为什么这里i的结果认为2?
  • 原因在于编译器的优化。当一个变量为const属性时,编译器认为该变量不在被修改,所以会用一个寄存器直接保存该变量的结果;或者在编译阶段直接类似宏替换,将i替换为2。

所以我们可以通过关键字volatile禁止编译器对常变量的优化!!

int main()
{volatile const int i = 2;int* p = const_cast<int*>(&i);//删除常变量i的const属性(*p)++;//cout << i << ":" << *p << endl;printf("i=%d, *p=%d\n", i, *p);return 0;
}

在这里插入图片描述

  1. 这里输出时不要用cout。原因在于这里使用volatile后,由于C++标准输出库存在缺陷,没有匹配到正确的重载函数。

dynamic_cast_75">2.4 新增类型转换:dynamic_cast

dynamic_cast用于动态转换,将一个父类对象的指针或引用转换为一个子类对象的指针或引用。

  1. 向上转换:子类对象指针/引用->父类指针/引用(我们认为该过程是天然的,不产生临时变量。通过赋值兼容规则(切片)直接将子类对象指针/引用给父类指针/引用)
  2. 向下转换:父类指针/引用->子类对象指针/引用。这种情况下,如果直接强转类型,可能回到住越界访问的风险。而dynamic_cast则可以避免该问题。(具体看实例)

tips:

  • dynamic_cast只能用于父类含有虚函数的类!!
  • dynamic_cast会先检查能否转换成功。如果能成功,则进行转换。否则返回一个空指针!!
void func(A* pa)
{//不安全, 原因在于如果是一个A类型的指针转递给pa,此时后续访问_b是发生越界访问//B* ptr = (B*)pa;//使用dynamic_cast,如果将A类型的指针转递给pa会转换失败,返回空指针//而将B类型的指针转递给pa, 转换成功,恢复到原始状态B* ptr = dynamic_cast<B*>(pa);if (ptr){ptr->_a++;ptr->_b++;cout << ptr->_a << ":" << ptr->_b << endl;}else{cout << "转换失败" << endl;}
}int main()
{A a;B b;cout << "B b -> func(&a):" << endl;func(&a);//转换失败cout << endl;cout << "A a -> func(&b):" << endl;func(&b);return 0;return 0;
}

在这里插入图片描述

RTTI__124">三、 什么是RTTI

RTTI:Run-time Type identification的简称,即:运行时类型识别。C++通过以下方式来支持RTTI

  1. typeid运算符
  2. dynamic_cast运算符
  3. decltype

http://www.ppmy.cn/news/1528842.html

相关文章

Spark-广播变量源码分析

一、广播变量使用 源码中给的例子是&#xff1a;org.apache.spark.examples.BroadcastTest 其中我们关心的只有两行代码&#xff0c;即创建广播变量和使用广播变量 //准备测试数据 val arr1 (0 until num).toArray //创建广播变量 val barr1 sc.broadcast(arr1) //使用广播…

python selenium网页操作

一、安装依赖 pip install -U seleniumselenium1.py&#xff1a; from selenium import webdriver from selenium.webdriver.common.by import Bydriver webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/web-form.html") title driver.ti…

标准库标头 <bit>(C++20)学习

<bit>头文件是数值库的一部分。定义用于访问、操作和处理各个位和位序列的函数。例如&#xff0c;有函数可以旋转位、查找连续集或已清除位的数量、查看某个数是否为 2 的整数幂、查找表示数字的最小位数等。 类型 endian (C20) 指示标量类型的端序 (枚举) 函数 bit_ca…

微服务注册中⼼2

5.Nacos配置管理 Nacos除了可以做注册中⼼&#xff0c;同样可以做配置管理来使⽤ 5.1 统⼀配置管理 当微服务部署的实例越来越多&#xff0c;达到数⼗、数百时&#xff0c;逐个修改微服务配置就会让⼈抓狂&#xff0c;⽽且很容易出错。我们需要⼀种统⼀配置管理⽅案&#xf…

基于单片机的楼宇门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计程序具体实现截图参考文献设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设…

【数据结构】排序算法---计数排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaGo 结语 1. 定义 计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。计数排序不是基于比较的排序算法&#xff0c;其核心在于将输入的数据值转化为键存储在额外开辟的数组…

基于stm32的四旋翼无人机控制系统设计系统设计与实现

文章目录 前言资料获取设计介绍功能介绍设计程序 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业…

Gitlab及Git使用说明

目 录 1 Gitlab及Git介绍说明 5 1.1 什么是 Gitlab 5 1.2 什么是Git 5 1.3 Git 家族成员 5 1.4 Gitlab版本 5 1.5 Gitlab 优势 5 1.6 Gitlab 主要服务构成 6 1.7 Gitlab 简单工作流程 6 1.8 Gitlab用户角色 6 2 Gitlab安装与使用 7 2.1 Gitlab安装说明&#xff08;管理员&#…