C++中的类型转换

embedded/2025/2/2 17:19:45/

一、概述

C++ 提供了多种类型转换(Type Conversion)方式,以便在不同类型的数据之间进行转换。类型转换主要分为 隐式转换 和 显式转换(即强制转换)。其中,显式转换包括 C 风格转换、static_cast、dynamic_cast、const_cast 和 reinterpret_cast。

二、隐式类型转换(Implicit Conversion)

隐式转换是由编译器自动执行的类型转换,通常发生在以下几种情况:

  • 基本类型转换:从低精度到高精度(如 int 转换为 double)。
  • 算术转换:运算时,较低精度的类型会被转换为较高精度的类型(如 char 转换为 int)。
  • 指针转换:int* 可以隐式转换为 void*,但 void* 不能隐式转换回 int*。派生类的指针可以隐式转换为基类指针(向上转型)。
  • 布尔转换:非零整数转换为 true,零转换为 false。
  • 非空指针转换为 true,空指针转换为 false。

示例:

int a = 10;
double b = a;  // int 自动转换为 double
void* ptr;
int* pInt = &a;
ptr = pInt;  // int* 隐式转换为 void*

三、显式类型转换(Explicit Conversion)

C++ 提供了多种强制转换方式,其中包括 C 风格转换和 C++ 提供的 static_cast、dynamic_cast、const_cast 和 reinterpret_cast。
C 语言中的类型转换使用 (type) 语法:

double d = 3.14;
int i = (int)d;  // C 风格转换

C 风格转换的缺点:

  • 不够安全,难以区分转换的类型。
  • 可能会绕过 C++ 类型检查,导致潜在错误。

四、C++ 风格类型转换

1. static_cast

  • 用途:用于相关类型之间的转换,如基本数据类型转换、类层次中的向上转换(派生类→基类指针/引用)、显式类型转换(无类型检查的向下转换)等。
  • 语法:static_cast<目标类型>(表达式)
  • 特点:编译时检查:不执行运行时类型检查,向下转换(基类→派生类)可能不安全。类层次中的向上转换(安全)。

示例:

double d = 3.14;
int i = static_cast<int>(d);  // 安全的基本类型转换class Base {};
class Derived : public Base {};Derived dObj;
Base* bPtr = static_cast<Base*>(&dObj);  // 向上转型

2. dynamic_cast

  • 用途:主要用于多态类型(含虚函数的类)的向下转换或交叉转换(如兄弟类之间的转换)。
  • 语法:dynamic_cast<目标类型>(表达式)
  • 特点:运行时检查:转换失败时返回 nullptr(指针)或抛出 std::bad_cast(引用)。仅限多态类型:基类必须有虚函数(否则编译错误)

示例:

class Base {
public:virtual ~Base() {}  // 必须有虚函数,才能使用 dynamic_cast
};class Derived : public Base {
public:void show() { std::cout << "Derived class" << std::endl; }
};Base* basePtr = new Derived();
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if (derivedPtr) {derivedPtr->show();
} else {std::cout << "Conversion failed!" << std::endl;
}

3. const_cast

用途:移除或添加 const/volatile 属性,常用于适配遗留代码或接口。 语法:const_cast<目标类型>(表达式)
注意事项:不修改原对象的常量性:若原对象为常量,通过指针/引用修改它是未定义行为。仅修改类型属性:不能改变实际类型(如 int* →double* 不可行)。

示例:

void modify(const int* p) {int* nonConstP = const_cast<int*>(p);*nonConstP = 42;
}int main() {int x = 10;modify(&x);std::cout << x << std::endl;  // 输出 42
}

4. reinterpret_cast

  • 用途:低级别、依赖实现的类型转换(如指针↔整数、无关指针类型之间的转换)。
  • 语法:reinterpret_cast<目标类型>(表达式)
  • 特点:高度不安全:不进行任何类型检查,可能导致未定义行为。使用场景极少:通常用于底层代码(如序列化、硬件访问)。

示例:

#include <iostream>int main() {int x = 42;int* p = &x;void* vp = reinterpret_cast<void*>(p);  // int* → void*int* p2 = reinterpret_cast<int*>(vp);  // void* → int*std::cout << *p2 << std::endl;  // 输出 42
}

http://www.ppmy.cn/embedded/158956.html

相关文章

Spring AOP 入门教程:基础概念与实现

目录 第一章&#xff1a;AOP概念的引入 第二章&#xff1a;AOP相关的概念 1. AOP概述 2. AOP的优势 3. AOP的底层原理 第三章&#xff1a;Spring的AOP技术 - 配置文件方式 1. AOP相关的术语 2. AOP配置文件方式入门 3. 切入点的表达式 4. AOP的通知类型 第四章&#x…

C语言初阶牛客网刷题—— HJ34 图片整理【难度:中等】

1. 题目描述 牛客网在线OJ链接 Lily上课时使用字母数字图片教小朋友们学习英语单词&#xff0c;每次都需要把这些图片按照大小&#xff08;ASCII码值从小到大&#xff09;排列收好。请大家给Lily帮忙&#xff0c;通过C语言解决。 输入描述&#xff1a;Lily使用的图片包括 “A…

JavaScript系列(43)--依赖注入系统实现详解

JavaScript依赖注入系统实现详解 &#x1f489; 今天&#xff0c;让我们深入探讨JavaScript的依赖注入系统实现。依赖注入是一种设计模式&#xff0c;它通过将依赖关系的创建和管理从代码中分离出来&#xff0c;提高了代码的可维护性和可测试性。 依赖注入基础概念 &#x1f…

使用LLaMA-Factory对AI进行认知的微调

使用LLaMA-Factory对AI进行认知的微调 引言1. 安装LLaMA-Factory1.1. 克隆仓库1.2. 创建虚拟环境1.3. 安装LLaMA-Factory1.4. 验证 2. 准备数据2.1. 创建数据集2.2. 更新数据集信息 3. 启动LLaMA-Factory4. 进行微调4.1. 设置模型4.2. 预览数据集4.3. 设置学习率等参数4.4. 预览…

面试经典150题——图的广度优先搜索

文章目录 1、蛇梯棋1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、最小基因变化2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、单词接龙3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 1、蛇梯棋 1.1 题目链接 点击跳转到题目位置 1.2 题目描述 给你一…

Anaconda使用教程 如何conda配置多版本Python环境

配置anaconda参考anaconda的安装和使用&#xff08;管理python环境看这一篇就够了&#xff09;-CSDN博客 Anaconda使用教程 主要用的两个为Anaconda Prompt 和Anaconda Navigator 打开cmd 第一次安装配置好conda的得先执行 conda init才能用 以后的创建环境和环境切换&…

Redis 的热 Key(Hot Key)问题及解决方法

Redis 的热 Key&#xff08;Hot Key&#xff09;问题及解决方法 1. 什么是 Redis 热 Key&#xff1f; Redis 热 Key&#xff08;Hot Key&#xff09;指的是访问频率极高的 Key&#xff0c;通常会造成以下问题&#xff1a; 单 Key 访问量过大&#xff1a;热点 Key 可能被高并…

计算机毕业设计Python+CNN卷积神经网络高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…