《21天学通C++》(第十三章) 类型转换运算符

1.为什么需要类型转换?

①兼容不同类型: 在C++中不同类型的数据不能直接进行运算,如需要则要进行类型转换

②指针转换: 在处理指针时,经常需要把一个类型的指针转化为另一个类型的指针

③与C语言兼容: C++兼容C语言,有时候需要把C++的类型数据转换为C语言的数据类型

函数重载、类继承、提高表达式性能 、处理多态 、实现特定编程技巧

2.C++有哪些类型转换运算符

①静态类型转换static_cast 主要用于基本数据类型之间的转换,如整数类型到浮点数类型的转换,或者在类层次结构中向上转型(从派生类指针或引用转换为基类指针或引用)。

使用场景

1.基本数据类型转换

2.类层次结构中的向上转型(静态转换用于向下转型不安全

语法

cpp 复制代码
目标类型 命名 = static_cast<目标类型>(表达式)

例子

cpp 复制代码
int i = 10;
float f = static_cast<float>(i); // 将整数i转换为浮点数f

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

Base* basePtr = new Base();
Derived* derivedPtr = static_cast<Derived*>(basePtr); 
// 向下转型,即基类指针basePtr 转化为派生类指针derivedPtr 

Derived d; // 创建派生类的对象
Base* b = static_cast<Base*>(&d); 
//向上转型,即派生类&d引用转化为基类指针b

②动态类型转换dynamic_cast 它在运行时检查对象的实际类型,以确定转换是否有效,主要用于涉及多态性的类层次结构中,尤其是在需要将基类指针或引用安全地转换为派生类指针或引用时。

使用场景

1.向下转型(可以检查是否成功,所以比静态类型安全)

2.实现多态性

语法

cpp 复制代码
目标类型 命名 = dynamic_cast<目标类型>(表达式)

例子

cpp 复制代码
class Base {public: virtual ~Base() {}};
class Derived : public Base {};

Base* basePtr = new Derived();  // 基类指针实际上指向一个派生类对象

// 向下转型为派生类指针
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if (derivedPtr != nullptr) {
    // 如果转换不可能
    //指针类型的dynamic_cast会返回nullptr
    //引用类型的dynamic_cast会抛出std::bad_cast异常。
} else {
    // 转换失败,basePtr实际上不指向Derived类型的对象
}
// 释放内存
delete basePtr;

PS:

1.务必检查dynamic_cast的返回值,看是否转化成功

2.dynamic_cast只能应用于含有虚函数的类,因为它们需要运行时类型信息(RTTI)来确定对象的实际类型。

③重新解释类型转换reinterpret_cast 它允许将一个指针或引用重新解释为完全不同的另一种类型的指针或引用,在某些特定的低级编程任务中,如直接操作内存或与 C 语言代码交互时可能会用到。

使用场景

1.指针类型之间的转换

2.函数指针之间的转换

3.整数和指针之间的转换

4.类成员指针之间的转换

语法

cpp 复制代码
目标类型 命名 = reinterpret_cast<目标类型>(表达式)

例子

cpp 复制代码
int* p = new int(65);

char* ch = reinterpret_cast<char*>(p);// 将 int* 转化为 char*
int* p2 = reinterpret_cast<int*>(ch);// 将 char* 转化为 int*,

// 将函数指针转换为 void* 类型指针
void (*funcPtr)() = someFunction;
void* pVoidFunc = reinterpret_cast<void*>(funcPtr);

④常量类型转换const_cast 用于修改const,让原本不允许修改 的常量对象可以进行修改,或者让原本不允许被视作常量的对象被视作常量。

语法

cpp 复制代码
目标类型 命名 = const_cast<目标类型>(表达式)

使用场景

1.移除 const

例子

cpp 复制代码
const int ci = 10;
int* modifiable = const_cast<int*>(ci);  // 移除 const,现在可以通过 modifiable 修改 ci 的值
相关推荐
唐诺4 小时前
几种广泛使用的 C++ 编译器
c++·编译器
冷眼看人间恩怨4 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
红龙创客5 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin5 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
yuanbenshidiaos6 小时前
c++---------数据类型
java·jvm·c++
十年一梦实验室7 小时前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
taoyong0017 小时前
代码随想录算法训练营第十一天-239.滑动窗口最大值
c++·算法
这是我587 小时前
C++打小怪游戏
c++·其他·游戏·visual studio·小怪·大型·怪物
fpcc7 小时前
跟我学c++中级篇——C++中的缓存利用
c++·缓存
呆萌很7 小时前
C++ 集合 list 使用
c++