C++ 新的类型转换

news/2024/7/5 1:58:57

文章目录

  • 前言
  • 一、静态转换(static_cast)
  • 二、动态转换(dynamic_cast):
  • 三、常量转换(const_cast):
  • 四、重新解释转换(reinterpret_cast):
  • 总结

前言

在 C++ 中,存在四种不同的类型转换方式,它们分别是:静态转换(static_cast)、动态转换(dynamic_cast)、常量转换(const_cast)和重新解释转换(reinterpret_cast)。每种转换方式都具有不同的作用和用法,下面我将逐一介绍它们。


一、静态转换(static_cast)

静态转换是一种在编译时进行的类型转换,它主要用于兼容类型之间的转换,如数值类型的转换、指针之间的转换、基类指针/引用向派生类指针/引用的转换。静态转换是一种较为常见的类型转换方式。

示例:

// 数值类型的转换
double num = 3.14;
int intValue = static_cast<int>(num); // 将浮点数转换为整数

// 指针之间的转换
int* intPtr = new int(42);
void* voidPtr = static_cast<void*>(intPtr); // 将 int 指针转换为 void 指针

// 基类指针/引用向派生类指针/引用的转换
class Base {
public:
    virtual void func() {}
};
class Derived : public Base {};

Base* basePtr = new Derived();
Derived* derivedPtr = static_cast<Derived*>(basePtr); // 将基类指针转换为派生类指针

在这里插入图片描述
在这里插入图片描述

二、动态转换(dynamic_cast):

动态转换主要用于在运行时进行类型安全检查。它通常用于在继承关系中进行指针或引用的类型转换,用以在转换之前进行类型检测和验证。动态转换只能用于具有多态性质的类,即需要运行时类型信息(RTTI)的支持。

class Base {
public:
    virtual void func() {}
};
class Derived : public Base {};

Base* basePtr = new Derived();
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); // 将基类指针转换为派生类指针

// 在不具备多态性质的类中,动态转换会返回 nullptr
class MyClass {
public:
    virtual void func() {}
};
MyClass obj;
Derived* derivedPtr2 = dynamic_cast<Derived*>(&obj); // 返回 nullptr

三、常量转换(const_cast):

常量转换用于在转换过程中添加或移除常量性。它允许将 const 或 volatile 限定符从指针或引用中移除,或者向其中添加 const 或 volatile 限定符。常量转换主要用于进行类型的底层转换,常常与指针和引用一起使用。

const int* constPtr = new int(5);
int* nonConstPtr = const_cast<int*>(constPtr); // 从常量指针移除 const 限定符

const float pi = 3.14;
float* nonConstPi = const_cast<float*>(&pi); // 从常量指针移除 const 限定符
*nonConstPi = 3.14159; // 修改原本为常量的值

四、重新解释转换(reinterpret_cast):

重新解释转换是一种较为低层次的转换方式,它将一个指针或引用转换为另一种不相关的类型。它可以将任何指针或引用转换为其他任何类型的指针或引用,甚至是不同类型的对象之间的转换。由于它不进行类型安全检查,所以应该谨慎使用。

int num = 10;
char* charPtr = reinterpret_cast<char*>(&num); // 重新解释转换为 char 指针

int* intPtr = reinterpret_cast<int*>(charPtr); // 重新解释转换为 int 指针

总结

需要注意的是,在使用类型转换时应尽量遵守良好的编程实践,并确保转换的安全性。不当的类型转换可能导致程序错误或未定义的行为。


http://lihuaxi.xjx100.cn/news/1267412.html

相关文章

FPGA BGA 芯片植球 - PCB焊盘与钢网和锡球

BGA 芯片植球&#xff0c;BGA芯片焊盘是0.6 PCB 焊盘是0.5 &#xff0c;钢网与锡球的选择 选择正确的锡膏球尺寸是根据BGA芯片焊盘和PCB焊盘的尺寸来确定的。通常&#xff0c;锡膏球的直径应略小于焊盘的直径&#xff0c;以确保焊膏能够适当地涂覆焊盘而不超出其边缘。 考虑到…

把金融航母开进智能峡湾,总共分几步?

试想一下&#xff0c;有这么一家街头小店。夫妻两个勤奋经营&#xff0c;诚信待客&#xff0c;广受街里街坊的欢迎。他们流水稳定&#xff0c;蒸蒸日上&#xff0c;商业信誉很好&#xff0c;甚至是非物质文化遗产的传承者。这样一家店&#xff0c;在扩大经营&#xff0c;拓展业…

​LeetCode解法汇总5-正则表达式匹配​

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 你有一个用于表示一片土地的整数矩阵land&#xff0c;该矩阵中每个点的值代表对…

JAVA文件传输(论文+源代码)

随着计算机网络技术的飞速发展,客户/服务C/S(Client/Sersver)结构成为开发FTP的网络编程结构,Java作为Web应用程序的开 发技术也为更多的人所采用。 起初, FTP并不是应用于IP网络上的协议,而是ARPANET网络中计算机间的文件传输协议, ARPANET是美国国防部组建的老网络,于…

FBM207C RH917GY将相关调节系统打到手动状态,必要时到现场进行调节

​ FBM207C RH917GY将相关调节系统打到手动状态&#xff0c;必要时到现场进行调节 FBM207C RH917GY将相关调节系统打到手动状态&#xff0c;必要时到现场进行调节 随着自动化水平的提高&#xff0c;dcs控制系统(集散控制系统)逐渐代替了常规仪表&#xff0c;其优越性已被广大操…

【Python】字符串 合并 切片 转换 格式化 拆分组合 find index count strip

2.2 字符串 可用单引号、双引号、三引号。 字符串是一种不可变序列。 1&#xff09;合并、重复 result "hello" * 3 "world" * 2 print(result) # 输出&#xff1a;"hellohellohelloworldworld"2&#xff09;切片、索引 索引&#xff1a;从0…

极致呈现系列之:Echarts旭日图的绚丽奇观

目录 什么是旭日图旭日图的特性及应用场景旭日图的特性应用场景 旭日图常用的配置项创建基本的旭日图自定义旭日图样式样式旭日图的高级应用 什么是旭日图 旭日图是一种可视化图表&#xff0c;用于展示层级结构和层级之间的关系。它以一个圆形为基础&#xff0c;由多层的环形图…

闪亮登场!在树莓派上点亮LED灯的简单详细方法

文章目录 树莓派开发与STM32开发的比较原理图以及树莓派引脚展示点灯步骤读取树莓派布局 树莓派开发与STM32开发的比较 树莓派和STM32都是常用的嵌入式设备&#xff0c;都可以使用GPIO来控制LED灯。它们的点灯方式和使用的编程语言以及开发环境略有不同: 相同点&#xff1a; 控…