一文说清C++类型转换操作符(cast operator)

news/2024/11/16 14:30:10/

一 前言

大家在编程时,一定会遇到要做类型转换的应用场景。
但是,C风格的类型转换太强大,太危险,它允许将一个给定类型转换成我们想要的任何其他类型。
所以在C++中,提供了一些更安全和更明确的类型转换操作符,来进行类型转换。
以下是关于各种类型转换的扩展示例,以展示它们的用法和特点,包括如下几种:

  • dynamic_cast
  • static_cast
  • const_cast
  • reinterpret_cast

二 各类转换说明

1 dynamic_cast

dynamic_cast 用于多态类型的安全转换。它通过运行时类型识别(RTTI)来确保转换的有效性。

#include <iostream>
#include <exception>class Base {
public:virtual ~Base() {} // 确保 Base 是一个多态类型
};class Derived : public Base {
public:void show() {std::cout << "Derived class" << std::endl;}
};class AnotherClass {};int main() {Base* basePtr = new Derived(); // Base 指针指向 Derived 对象// 使用 dynamic_cast 进行安全转换if (Derived* derivedPtr = dynamic_cast<Derived*>(basePtr)) {derivedPtr->show(); // 成功转换,调用 Derived 的方法} else {std::cout << "Failed to cast Base to Derived" << std::endl;}// 尝试将 Base 指针转换为 AnotherClass 指针try {AnotherClass* anotherPtr = dynamic_cast<AnotherClass*>(basePtr); // 无效转换if (anotherPtr == nullptr) {throw std::bad_cast(); // 抛出 bad_cast 异常}} catch (const std::bad_cast& e) {std::cout << "Caught bad_cast exception: " << e.what() << std::endl;}delete basePtr; // 释放内存return 0;
}

2 static_cast

static_cast 用于非多态类型的转换,没有运行时检查。

#include <iostream>class Base {
public:virtual ~Base() {}
};class Derived : public Base {
public:void show() {std::cout << "Derived class" << std::endl;}
};int main() {Base* basePtr = new Derived(); // Base 指针指向 Derived 对象// 使用 static_cast 进行转换Derived* derivedPtr = static_cast<Derived*>(basePtr);derivedPtr->show(); // 成功转换,调用 Derived 的方法delete basePtr; // 释放内存return 0;
}

3 const_cast

const_cast 用于去除对象的常量性(constness)。

#include <iostream>void modifyValue(const int* ptr) {int* nonConstPtr = const_cast<int*>(ptr); // 去除常量性*nonConstPtr = 20; // 修改值
}int main() {int value = 10;const int* constPtr = &value;std::cout << "Before: " << value << std::endl;modifyValue(constPtr);std::cout << "After: " << value << std::endl; // 输出修改后的值return 0;
}

4 reinterpret_cast

reinterpret_cast 用于进行低级别的类型转换,通常用于指针和整型类型之间的转换。
这是C++中最灵活也是最危险的类型转换操作,仅次于传统的C语言转换操作符。

#include <iostream>int main() {int num = 65;// 将整型转换为字符指针char* charPtr = reinterpret_cast<char*>(&num);std::cout << "Integer value: " << num << std::endl;std::cout << "Interpreted as char: " << *charPtr << std::endl; // 输出对应的字符// 将指针转换回整型int* intPtr = reinterpret_cast<int*>(charPtr);std::cout << "Interpreted back to int: " << *intPtr << std::endl; // 输出回到整型值return 0;
}

三 总结

  1. dynamic_cast: 适用于多态类型的安全转换,包含运行时检查。
  2. static_cast: 用于非多态类型的转换,不进行运行时检查。
  3. const_cast: 用于去除常量性,可以修改原本是常量的对象。
  4. reinterpret_cast: 提供指针和整型之间的低级别类型转换,灵活但风险较高。

使用这些类型转换操作符时,大家需要谨慎,以确保类型安全和程序的可维护性。


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

相关文章

第二十一章 TCP 客户端 服务器通信 - 客户端OPEN命令

文章目录 第二十一章 TCP 客户端 服务器通信 - 客户端OPEN命令客户端OPEN命令 第二十一章 TCP 客户端 服务器通信 - 客户端OPEN命令 客户端OPEN命令 客户端OPEN命令与服务器端OPEN命令只有一个方面的不同&#xff1a;第一个设备参数必须指定要连接的主机。要指定主机&#xf…

MyBatis XML一个方法执行插入或更新操做(PostgreSQL)

MyBatis XML一个方法执行插入或更新操做(PostgreSQL) 在MyBatis中&#xff0c;你可以使用PostgreSQL的INSERT … ON CONFLICT子句来实现插入或更新&#xff08;即"upsert"&#xff09;操作。以下是一个示例&#xff0c;展示如何在MyBatis中配置和执行这样的操作。 …

SOLIDWORKS Toolbox:一键自动化,让紧固件与零部件管理更高效

紧固件广泛应用于从手机到火箭的各种产品中。在SOLIDWORKS设计时&#xff0c;通过使用实际的CAD模型来包含和跟踪紧固件是最简便和全面的方法&#xff0c;这有助于理解设计的整体&#xff0c;并自动管理零件数据和设计文档&#xff0c;如工程图和物料清单(BOM)。 在SOLIDWORKS…

Ubuntu24.04上安装和配置MariaDB

Ubuntu24.04上安装和配置MariaDB #切换到root用户 sudo su -#更新系统&#xff0c;确保所有的软件都是最新的 apt update && sudo apt upgrade -y#要添加 MariaDB 存储库&#xff0c;我们需要安装一个名为 software-properties-common 的包 apt install software-prop…

28-一些常见的内存问题

诊断内存状况 ● 查看各个节点的内存状况 GET _cat/nodes?vGET _nodes/stats/indices?prettyGET _cat/nodesv&hname,queryCacheMemory,queryCacheEvictions,requestCacheMemory,requestCacheHitCount,request_cache.miss_countGET _cat/nodeshname,port,segments.memor…

AIGC行业现在适合进入吗?

AIGC行业现在适合进入吗&#xff1f; 引言 在信息时代的浪潮中&#xff0c;人工智能的崛起让我们看到了全新的机会&#xff0c;特别是在内容创作领域。AIGC&#xff08;人工智能生成内容&#xff09;技术正如一位全能的助手&#xff0c;悄然进入了我们的生活和工作。你是否曾…

【笔记】关于git和GitHub和git bash

如何推送更新的代码到github仓库 如何在此项目已经提交在别的远程仓库的基础上更改远程仓库地址&#xff08;也就是换一个远程仓库提交&#xff09; 如何删除github中的一个文件 第二版 删除github上的一个仓库或者仓库里面的某个文件_github仓库删除一个文件好麻烦-CSDN博客 …

读书笔记:《Redis设计与实现》之发布订阅

发布与订阅简介 命令 SUBSCRIBE: 订阅一个频道 SUBSCRIBE channel [channel ...]SUBSCRIBE: 向一个频道发送信息 PUBLISH channel messageUNSUBSCRIBE: 取消订阅一个频道 UNSUBSCRIBE [channel [channel ...]]PSUBSCRIBE:订阅一个或多给定模式的频道 PSUBSCRIBE pattern …