跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 类型转换详解

介绍 C++ 中的四种类型转换方式。对比 C 语言隐式与显式转换的缺陷,详细讲解 static_cast(对标隐式)、reinterpret_cast(强制转换指针与整型)、const_cast(去除 const 属性)及 dynamic_cast(多态向下转型)。强调 dynamic_cast 需父类含虚函数且运行时检查安全性,旨在提高代码可读性与类型安全。

小熊软糖发布于 2026/3/27更新于 2026/10/25110 浏览

1. C 语言中的类型转换

在 C 语言中,如果赋值运算符左右两侧的类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值的类型不一致时,就需要发生类型转化。

C 语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。

  1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
  2. 显式类型转化:需要用户自己处理

C 语言中,意义相近的类型可以完成隐式类型转换。比如 int 和 double,它们都是表示数据大小。 但是指针和整型就不能完成隐式类型转换,但是可以强制转换,因为二者终归是有关联的。但是几乎没有关联的类型就不能转换了。

缺陷: 转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。

2. C++ 的类型转换

2.1 static_cast

C 语言隐式类型转换:

#include <iostream>
using namespace std;
int main() { 
    double d = 12.34; 
    int a = d; 
    cout << a << endl; 
    return 0; 
}

文章配图

C++ 的 static_cast:

#include <iostream>
using namespace std;
int main() { 
    double d = 12.34; 
    int a = static_cast<int>(d); 
    cout << a << endl; 
    return 0; 
}

文章配图

static_cast基本对标 C 语言的隐式类型转换。

2.2 reinterpret_cast

指针和整型之间,进行隐式类型转换,会报错:

文章配图

需要转换为强制类型转换:

文章配图

C++ 的 reinterpret_cast:

#include <iostream>
using namespace std;
int main() { 
    int a = 10; 
    int* p = reinterpret_cast<int*>(a); 
    cout << p << endl; 
    return 0; 
}

文章配图

reinterpret_cast基本对标 C 语言的强制类型转换。

2.3 const_cast

const_cast可以把 const 修饰,给去除掉:

文章配图

为什么 a 和*p 的值不同,但是地址却是相同的?

原因是编译器进行了优化,把 a 直接替换为了常量,或是直接存放在寄存器中。

2.3.1 volatile

volatile:破除掉编译器的优化

#include <iostream>
using namespace std;
int main() { 
    volatile const int a = 2; 
    int* p = const_cast<int*>(&a); 
    *p = 3; 
    cout << a << endl; 
    cout << *p << endl; 
    cout << &a << endl; 
    cout << p << endl; 
    return 0; 
}

文章配图

2.3.2 注意

C++ 添加上四种类型转换,主要是为了提高可读性。 比如这里的 const_cast,警醒程序员,这里的转换很危险。 而 C 语言都是一个强制类型转换,就无法区分了。

2.4 dynamic_cast

dynamic_cast,用于将一个父类对象的指针、引用,转换为子类对象的指针或引用 (动态转换)。 向上转型:子类对象指针、引用 --> 父类指针、引用 (不需要转换,赋值兼容规则)。 向下转型:父类对象指针、引用 --> 子类指针、引用 (用 dynamic_cast 转型是安全的)。

注意:

  1. dynamic_cast 只能用于父类含有虚函数的类
  2. dynamic_cast 会先检查是否能转换成功,能成功则转换,不能则返回 0

代码:

class A { 
public: 
    virtual void f() {} 
    int _a = 0; 
}; 
class B : public A { 
public: 
    int _b = 1; 
};

问题:

文章配图

C++ 使用 dynamic_cast 解决问题:

文章配图

dynamic_cast:在运行时,识别指针是指向父类,还是指向子类

总结:

dynamic_cast 必须用于多态类,父类必须有虚函数。 应对的是向下转换,向上转换有赋值兼容规则,不需要转换

目录

  1. 1. C 语言中的类型转换
  2. 2. C++ 的类型转换
  3. 2.1 static_cast
  4. 2.2 reinterpret_cast
  5. 2.3 const_cast
  6. 2.3.1 volatile
  7. 2.3.2 注意
  8. 2.4 dynamic_cast

更多推荐文章

查看全部
  • MATLAB 智能代码生成与纠错工具 Copilot_AI 功能介绍
  • Python 基础语法、环境配置与实战项目详解
  • C++ 红黑树模拟实现
  • Whisper.cpp 量化模型清单及 ggml 格式下载指南
  • 用 Python 绘制可爱的招财猫
  • 直流无刷电机 FOC 控制算法原理与 STM32 实现
  • 6 个月免费的 Claude Max 20x:开源维护者现在值得去申请
  • Python 函数闭包概念详解与应用实例
  • Golang Gin 框架中的表单处理与数据绑定
  • 常见排序算法原理与实现详解
  • C++ 开发基础:STL 核心组件与字符编码避坑指南
  • NDK 开发入门:C++ 基础与 JNI 调用详解
  • 使用 Selenium 搭建免费 Web 搜索 API 服务
  • 基于 Python 与 AI 的智能害虫识别系统实战
  • AI 世界模型全解析:技术原理、研究进展与产业落地
  • 基于 YOLO11 的无人机航拍小目标检测算法与系统实现
  • OpenClaw 实战部署指南:配置 AI 远程员工与自动化工作流
  • 基于 LLaMA-Factory 微调 Qwen3.5-4B 构建医疗 AI 助手
  • 蓝牙 LE Audio BAP 协议精讲:单播服务器服务部署与能力公示
  • Web3 社区运营核心策略与实践

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online