【C/C++】C++ 四种强制转换

news/2024/10/23 5:30:48/

文章目录

    • 基本概念
    • 适用场景及代码案例
    • 测试运行Demo

基本概念

C++ 中有四种强制转换方式,分别是:

  1. static_cast:用于基本数据类型之间的转换,以及具有继承关系的指针或引用之间的转换。static_cast 在编译时进行类型检查,如果转换不合法则会产生编译错误。

  2. dynamic_cast:用于具有继承关系的指针或引用之间的转换,可以在运行时检查类型是否匹配。如果转换不合法,则返回空指针或引用。

  3. const_cast:用于去除指针或引用的 const 属性,可以将 const 类型转换为非 const 类型。const_cast 可以改变指针或引用的常量属性,但不能改变对象本身的常量属性。

  4. reinterpret_cast:用于不同类型之间的转换,可以将一个指针或引用转换为另一个类型的指针或引用。reinterpret_cast 不进行类型检查,因此可能会导致未定义的行为,应该谨慎使用。

需要注意的是,强制转换可能会导致数据的精度丢失或类型不匹配等问题,应该在必要的情况下使用,并且需要进行充分的测试和验证。

适用场景及代码案例

下面分别举例说明四种强制转换的使用场景:

  1. static_cast:将 int 类型转换为 double 类型。例如:

    int a = 10;
    double b = static_cast<double>(a);
    
  2. dynamic_cast:将基类指针转换为派生类指针,并检查是否转换成功。例如:

    class Base {
    public:virtual void func() {}
    };class Derived : public Base {
    public:void func() {}
    };Base* pBase = new Derived();
    Derived* pDerived = dynamic_cast<Derived*>(pBase);
    if (pDerived != nullptr) {pDerived->func();
    }
    
  3. const_cast:将 const int 类型转换为 int 类型。例如:

    const int a = 10;
    int b = const_cast<int&>(a);
    
  4. reinterpret_cast:将一个整型指针转换为一个字符型指针。例如:

    int a = 10;
    char* pChar = reinterpret_cast<char*>(&a);
    

需要注意的是,强制转换可能会导致数据的精度丢失或类型不匹配等问题,应该在必要的情况下使用,并且需要进行充分的测试和验证。

测试运行Demo

可以,下面是一个使用四种强制转换的可运行程序示例:

#include <iostream>using namespace std;int main() {// static_castint a = 10;double b = static_cast<double>(a);cout << "static_cast: " << b << endl;// dynamic_castclass Base {public:virtual void func() {}};class Derived : public Base {public:void func() {}};Base* pBase = new Derived();Derived* pDerived = dynamic_cast<Derived*>(pBase);if (pDerived != nullptr) {cout << "dynamic_cast: success" << endl;pDerived->func();} else {cout << "dynamic_cast: failed" << endl;}// const_castconst int c = 20;int d = const_cast<int&>(c);cout << "const_cast: " << d << endl;// reinterpret_castint e = 30;char* pChar = reinterpret_cast<char*>(&e);cout << "reinterpret_cast: " << *pChar << endl;return 0;
}

该程序使用了四种强制转换方式,分别将 int 类型转换为 double 类型、将基类指针转换为派生类指针并检查是否转换成功、将 const int 类型转换为 int 类型、将一个整型指针转换为一个字符型指针。运行程序后,输出结果如下:

static_cast: 10
dynamic_cast: success
const_cast: 20
reinterpret_cast: 

其中,reinterpret_cast 的输出结果可能因为字符编码的不同而有所不同。


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

相关文章

计算机视觉的热门研究方向与发展趋势

计算机视觉产业链 工业界&#xff1a;对学术研究提出需求 最火的两个概念&#xff1a;自动驾驶和元宇宙 相关热点研究方向&#xff1a; &#xff08;1&#xff09;建图技术&#xff1a;三维重建技术&#xff0c;包括SLAM、定位、建图、更新等技术&#xff1b;&#xff08;2&…

基于LDA+SVM实现人脸识别模型

基于LDASVM实现人脸识别模型 描述 人脸识别&#xff08;图像识别&#xff09;是机器学习领域十经典的应用&#xff0c;在本质上&#xff0c;人脸识别属于监督学习中的分类问题。前面章节中我们已经学习了支持向量机&#xff08;SVM&#xff09;&#xff0c;该算法在图像分类领…

又一科研利器诞生!能对话的论文阅读器,hammerScholar

文&#xff5c;智商掉了一地 hammerScholar 新升级&#xff0c;用对话式读论文工具提升科研生产力~ 不得不说&#xff0c;自从 AIGC 这个概念出现以来&#xff0c;它极强的内容理解与生成能力也推动着各种生产力工具层出不穷&#xff0c;除了一些浏览器和代码插件以外&#xff…

26岁转行网络安全,成功上岸安全开发!

前言 我是去年 9 月 22 日才正式学习网络安全的&#xff0c;之前在国营单位工作了 4 年&#xff0c;在长沙一个月工资只有 5000 块&#xff0c;而且看不到任何晋升的希望&#xff0c;如果想要往上走&#xff0c;那背后就一定要有关系才行。 而且国营单位的气氛是你干的多了&a…

我去蔚来试驾了

前面写了比亚迪汉、小鹏P7i的试驾体验&#xff0c;链接如下&#xff1a; 小鹏P7I试驾体验&#xff01; 今天接着分享蔚来ET5的试驾体验&#xff0c;实话实说&#xff0c;我是蔚来ET5的颜粉&#xff0c;颜值也是ET5最大的卖点之一。 我身边不少朋友&#xff0c;不管是男生还是女…

物联网安全性测试和常见漏洞

物联网安全性测试和常见漏洞 尽管物联网&#xff08;IoT&#xff09;重新定义了我们的生活并带来了很多好处&#xff0c;但它的攻击面很大&#xff0c;并且在安全之前是不安全的。如果没有适当的保护&#xff0c;物联网设备很容易成为网络犯罪分子和黑客的目标。您可能会遇到财…

VMware ESXi 8.0U1 发布 - 领先的裸机 Hypervisor

请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-8-u1/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 2023-04-18, VMware vSphere 8.0U1 发布。 详见&#xff1a;VMware vSphere 8 Update 1 新增功能 产品简…

【Leetcode -263.丑数 -268.丢失的数字】

Leetcode Leetcode -263.丑数Leetcode -268.丢失的数字 Leetcode -263.丑数 题目&#xff1a;丑数就是只包含质因数 2、3 和 5 的正整数。 给你一个整数 n &#xff0c;请你判断 n 是否为 丑数 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例…