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

2024-05-02 18:44

本文主要是介绍《21天学通C++》(第十三章) 类型转换运算符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

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

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

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

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

使用场景
1.基本数据类型转换
2.类层次结构中的向上转型(静态转换用于向下转型不安全

语法

目标类型 命名 = static_cast<目标类型>(表达式)

例子

int i = 10;
float f = static_cast<float>(i); // 将整数i转换为浮点数fclass 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.实现多态性

语法

目标类型 命名 = dynamic_cast<目标类型>(表达式)

例子

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.类成员指针之间的转换

语法

目标类型 命名 = reinterpret_cast<目标类型>(表达式)

例子

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,让原本不允许修改的常量对象可以进行修改,或者让原本不允许被视作常量的对象被视作常量。

语法

目标类型 命名 = const_cast<目标类型>(表达式)

使用场景
1.移除 const

例子

const int ci = 10;
int* modifiable = const_cast<int*>(ci);  // 移除 const,现在可以通过 modifiable 修改 ci 的值

这篇关于《21天学通C++》(第十三章) 类型转换运算符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/954924

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

2024/9/8 c++ smart

1.通过自己编写的class来实现unique_ptr指针的功能 #include <iostream> using namespace std; template<class T> class unique_ptr { public:         //无参构造函数         unique_ptr();         //有参构造函数         unique_ptr(