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

一 前言

大家在编程时,一定会遇到要做类型转换的应用场景。

但是,C风格的类型转换太强大,太危险,它允许将一个给定类型转换成我们想要的任何其他类型。

所以在C++中,提供了一些更安全和更明确的类型转换操作符,来进行类型转换。

以下是关于各种类型转换的扩展示例,以展示它们的用法和特点,包括如下几种:

  • dynamic_cast
  • static_cast
  • const_cast
  • reinterpret_cast

二 各类转换说明

1 dynamic_cast

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

cpp 复制代码
#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 用于非多态类型的转换,没有运行时检查。

cpp 复制代码
#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)。

cpp 复制代码
#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语言转换操作符。

cpp 复制代码
#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: 提供指针和整型之间的低级别类型转换,灵活但风险较高。

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

相关推荐
_r0bin_2 小时前
前端面试准备-7
开发语言·前端·javascript·fetch·跨域·class
zhang98800002 小时前
JavaScript 核心原理深度解析-不停留于表面的VUE等的使用!
开发语言·javascript·vue.js
Fanxt_Ja4 小时前
【JVM】三色标记法原理
java·开发语言·jvm·算法
蓝婷儿4 小时前
6个月Python学习计划 Day 15 - 函数式编程、高阶函数、生成器/迭代器
开发语言·python·学习
love530love4 小时前
【笔记】在 MSYS2(MINGW64)中正确安装 Rust
运维·开发语言·人工智能·windows·笔记·python·rust
南郁5 小时前
007-nlohmann/json 项目应用-C++开源库108杰
c++·开源·json·nlohmann·现代c++·d2school·108杰
slandarer5 小时前
MATLAB | 绘图复刻(十九)| 轻松拿捏 Nature Communications 绘图
开发语言·matlab
狐凄5 小时前
Python实例题:Python计算二元二次方程组
开发语言·python
roman_日积跬步-终至千里5 小时前
【Go语言基础【3】】变量、常量、值类型与引用类型
开发语言·算法·golang
roman_日积跬步-终至千里6 小时前
【Go语言基础】基本语法
开发语言·golang·xcode