C++强制类型转换详细示例代码

 更新时间:2025年09月09日 08:28:20   作者:EnigmaCoder  
在C++中,强制类型转换(Type Casting)是将一种数据类型转换为另一种数据类型的操作,这篇文章主要介绍了C++强制类型转换的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

  • 在 C 语言中,我们习惯用 (type)expression 的“粗暴”方式做类型转换,但这种方式安全性不足、意图不明确。C++ 为了更安全、更清晰地控制类型转换,提供了 四种专用的强制类型转换运算符static_castreinterpret_castconst_castdynamic_cast

static_cast:最常用的“非多态”转换

static_cast最常用 的类型转换运算符,主打 “非多态场景” 的类型转换,编译期间就会做合法性检查,能替代 C 语言中普通的类型转换。

适用场景

  1. 基本数据类型之间的转换(如 intfloat 互转);
  2. 将任意类型转换为 void 类型;
  3. 空指针(或 void*)与具体类型指针的转换;
  4. 类继承体系中 “向上转换”(派生类 → 基类,天然安全)。

代码示例

#include <iostream>
using namespace std;

int main() {
    // 1. 基本数据类型转换
    float floatNum = 3.14f;
    int intNum = static_cast<int>(floatNum);
    cout << "float → int: " << intNum << endl; // 输出:3(小数被截断)

    intNum = 5;
    floatNum = static_cast<float>(intNum);
    cout << "int → float: " << floatNum << endl; // 输出:5.0

    // 2. 空指针与具体指针转换
    void* voidPtr = nullptr;
    int* intPtr = static_cast<int*>(voidPtr);
    cout << "void* → int*: " << intPtr << endl; // 输出:0(nullptr)

    return 0;
}

注意点

  • 类继承中 “向下转换”(基类 → 派生类)时,static_cast 不做运行时检查。如果转换逻辑错误,会导致“未定义行为”(此时应该用 dynamic_cast)。

reinterpret_case:底层“位模式”的重新解释

reinterpret_cast 主打 “底层位模式的重新解释”,它不做数据转换或类型检查,完全是“按位硬转”,因此风险很高,仅用于特殊底层场景。

适用场景

  • 不同类型指针/引用之间的“位模式”直接转换;
  • 整数与指针之间的底层转换(依赖平台实现,少用)。

代码示例

#include <iostream>
using namespace std;

int main() {
    // 1. 字符 → 整数(直接解释 ASCII 位模式)
    char ch = 'A'; // 'A' 的 ASCII 码是 65
    int ascii = reinterpret_cast<int&>(ch);
    cout << "char → int(ASCII 值): " << ascii << endl; // 输出:65

    // 2. 指针类型的底层转换(int* → float*)
    int* intPtr = nullptr;
    float* floatPtr = reinterpret_cast<float*>(intPtr);
    cout << "int* → float*: " << floatPtr << endl; // 输出:0(与 intPtr 地址一致)

    return 0;
}

注意点

  • reinterpret_cast 完全跳过 C++ 类型系统,极易引发“未定义行为”,仅在硬件操作、二进制协议解析等底层场景使用。

const_cast:专门“移除 const 限定”

const_cast 是“专项工具”——专门用于移除指针或引用的 const(或 volatile)属性,让原本被 const 限制的指针/引用能修改指向的内容。

适用场景

  • 移除指针的 const 属性;
  • 移除引用的 const 属性。

代码示例

#include <iostream>
using namespace std;

int main() {
    int num = 100; // 注意:若原对象本身是 const,修改会出问题,这里用非 const 变量演示
    const int* constPtr = &num;

    // 移除指针的 const 属性
    int* normalPtr = const_cast<int*>(constPtr);
    *normalPtr = 200;
    cout << "修改后 num: " << num << endl; // 输出:200

    // 移除引用的 const 属性
    const int& constRef = num;
    int& normalRef = const_cast<int&>(constRef);
    normalRef = 300;
    cout << "再次修改后 num: " << num << endl; // 输出:300

    return 0;
}

注意点

  • 如果原始对象本身声明为 const(如 const int num = 100;),用 const_cast 移除 const 后再修改它,会导致“未定义行为”(程序可能崩溃或结果异常)。

dynamic_cast:运行时的“多态安全转换”

dynamic_cast 主打 “多态类(含虚函数)的运行时类型检查”,主要用于类继承体系中“向上转换”(派生 → 基类)或“向下转换”(基类 → 派生),保证转换的安全性。

适用场景

  • 类继承中 “向下转换”(基类 → 派生类),运行时检查是否合法;
  • 类继承中 “向上转换”(派生 → 基类),效果和 static_cast 一致;
  • 多继承场景下的“交叉转换”。

代码示例

#include <iostream>
using namespace std;

// 基类:必须包含虚函数,才能启用“运行时类型识别(RTTI)”
class Base {
public:
    virtual void show() { cout << "Base class" << endl; }
};

class Derived : public Base {
public:
    void show() override { cout << "Derived class" << endl; }
};

int main() {
    // 场景1:基类指针指向派生类对象(向下转换合法)
    Base* basePtr1 = new Derived();
    Derived* derivedPtr1 = dynamic_cast<Derived*>(basePtr1);
    if (derivedPtr1 != nullptr) {
        cout << "dynamic_cast(Base*→Derived*)成功: ";
        derivedPtr1->show(); // 调用 Derived 的 show()
    }

    // 场景2:基类指针指向基类对象(向下转换非法,返回 nullptr)
    Base* basePtr2 = new Base();
    Derived* derivedPtr2 = dynamic_cast<Derived*>(basePtr2);
    if (derivedPtr2 == nullptr) {
        cout << "dynamic_cast(Base*→Derived*)失败(符合预期)" << endl;
    }

    // 释放动态内存
    delete basePtr1;
    delete basePtr2;

    return 0;
}

注意点

  • dynamic_cast 依赖 “运行时类型信息(RTTI)”,因此基类必须包含虚函数(否则编译报错);
  • 向下转换时,若基类指针实际指向派生类对象,转换成功;否则返回 nullptr(指针场景)或抛出异常(引用场景)。

总结:四种转换的分工

转换运算符核心作用场景特点
static_cast日常非多态转换,编译期检查最常用、安全(非向下转)
reinterpret_cast底层位模式重新解释风险高,仅底层场景用
const_cast专门移除 const 限定专项工具,需谨慎修改
dynamic_cast多态类的运行时安全转换依赖虚函数,运行时检查

1 使用dynamic_cast<>的情况

类层次结构中父类和子类之间指针和引用的转换(运行时,类型检查,保证了程序的安全性)【可以用于基类指针指向派生类的指针】
其他情况使用static_cast<>。

2 使用static_cast<>的情况

  • 基本数据类型间的类型转换
  • 把空指针转换成目标类型的空指针
  • 把任何类型的表达式类型转换成void类型
  • 用于类层次结构中父类和子类之间指针和引用的转换。(仅用于指向派生类的指针,访问指向父类的内容)

到此这篇关于C++强制类型转换的文章就介绍到这了,更多相关C++强制类型转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言 typedef的用法示例详解

    C语言 typedef的用法示例详解

    typedef是在C和C++编程语言中的一个关键字,作用是为现有的数据类型(int、float、char……)创建一个新的名字,目的是为了使代码方便阅读和理解,这篇文章主要介绍了C语言typedef的使用,需要的朋友可以参考下
    2023-06-06
  • 关于函数调用方式__stdcall和__cdecl详解

    关于函数调用方式__stdcall和__cdecl详解

    下面小编就为大家带来一篇关于函数调用方式__stdcall和__cdecl详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • VS2019中在源文件中如何使用自己写的头文件

    VS2019中在源文件中如何使用自己写的头文件

    通过头文件的形式直接调用自定义的函数,从而免去对函数的原型进行声明,本文就详细的介绍一下VS2019中在源文件中如何使用自己写的头文件,感兴趣的可以了解一下
    2021-09-09
  • QT使用Http协议通信的实现示例

    QT使用Http协议通信的实现示例

    使用QT进行应用开发时,有时候需要进行客户端和服务端的网络通信,本文主要介绍了QT使用Http协议通信的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • 用c语言实现一个电话薄(附完整代码)

    用c语言实现一个电话薄(附完整代码)

    大家好,本篇文章主要讲的是用c语言实现一个电话薄(附完整代码),感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • Qt实现保存、浏览、预览、打印功能的示例代码

    Qt实现保存、浏览、预览、打印功能的示例代码

    下面小编就为大家分享一篇Qt实现保存、浏览、预览、打印功能的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 二维指针动态分配内存连续问题深入分析

    二维指针动态分配内存连续问题深入分析

    当我们定义一个二维指针时,如果需要存储相应的数据,就需要我们动态的分配内存,这时,有一点是需要注意的,分配内存的方法不同,内存的连续性也是不相同的
    2013-07-07
  • C++中的常量定义小结

    C++中的常量定义小结

    在C++中,并不提倡使用#define定义一个常量。#define本质上是一个预处理器指令,它仅仅表示使用一个串代替别一个串而已。也就是说,#define定义的常量从未被编译器看到——它们在编译器开始处理源码之前就被移走了
    2015-08-08
  • STL中vector的使用你了解吗

    STL中vector的使用你了解吗

    这篇文章主要为大家详细介绍了STL中vector的使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++友元函数和友元类的使用与区别

    C++友元函数和友元类的使用与区别

    本文主要介绍了C++友元函数和友元类的使用与区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论