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

这篇具有很好参考价值的文章主要介绍了【C/C++】C++ 四种强制转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本概念

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_cast
    int a = 10;
    double b = static_cast<double>(a);
    cout << "static_cast: " << b << endl;

    // 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) {
        cout << "dynamic_cast: success" << endl;
        pDerived->func();
    } else {
        cout << "dynamic_cast: failed" << endl;
    }

    // const_cast
    const int c = 20;
    int d = const_cast<int&>(c);
    cout << "const_cast: " << d << endl;

    // reinterpret_cast
    int 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 的输出结果可能因为字符编码的不同而有所不同。文章来源地址https://www.toymoban.com/news/detail-421676.html

到了这里,关于【C/C++】C++ 四种强制转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++11的四种强制类型转换

    目录 语法格式 static_cast(静态转换) dynamic_cast(动态转换) const_cast(常量转换)  reinterpret_cast(重解释) cast-name typename (expression) 其中 cast-name 为 static_cast 、 dynamic_cast 、 const_cast  和  reinterpret_cast 之一, typename 为需要转换的目标类型,而 expression 是被强制转换的值。 1、父类到

    2024年02月11日
    浏览(40)
  • C++ 强制类型转换

    在C++中,有四种强制类型转换: 1、 static_cast :这是最常见的类型转换。它可以用于基本数据类型之间的转换,也可以用于指向父类和子类之间的指针或引用的转换。 static_cast可以实现下列转换: ①基本数据类型之间的转换。 ②将任何类型转换为void类型。 ③把空指针转换成

    2024年02月14日
    浏览(32)
  • C++强制类型转换

    static_cast 是 C++ 中的一种显式类型转换运算符。 它可以将一个表达式强制转换为指定的类型,并且是静态类型转换,因此不会执行任何运行时类型检查。如果类型转换不合法,则程序可能出现未定义的行为。因此,使用 static_cast 要特别小心,确保类型转换的合法性。 格式

    2024年02月07日
    浏览(56)
  • c++面试——强制类型转换

    方式 说明 示例 static_cast 用于基本类型之间、类继承体系之间的转换 int - double Derived* - Base* const_cast 用于移除变量的const、volatile等属性 const int - int dynamic_cast 用于类继承体系之间的安全向下转换,转换失败返回NULL Derived* - Base* reinterpret_cast 用于不相关类型之间的转换,结果不安

    2023年04月25日
    浏览(30)
  • 【C++】C++的四种类型转换

    当等号两边的类型不同的时候、形参与实参类型不匹配的时候、返回值类型与接收返回值类型不一致时,就需要发生 类型转化 。 而类型转换又 分为隐式类型转换和显示类型转换 。 隐式类型转换是编译器在编译阶段自动进行,能转就转,不能转就编译失败。 而显示类型转换

    2023年04月09日
    浏览(42)
  • 【C++干货铺】C++中的四种类型转换

    ========================================================================= 个人主页点击直达:小白不是程序员 C++系列专栏:C++干货铺 代码仓库:Gitee ========================================================================= 目录 C语言中的类型转换 为什么C++需要四种类型转化 C++强制类型转换 static_cast reinter

    2024年01月25日
    浏览(34)
  • C# 中有四种定时器

    目录 C# / .Net中的四种定时器: 1、System.Threading.Timer 2:System.Timers.Timer 3:System.Windows.Forms.Timer(Windows Forms Timer) 4:System.Windows.Threading.DispatcherTimer(WPF timer); C# / .Net中的四种定时器:         System.Windows.Forms.Timer类型(Winfrom专用)         System.Threading.Timer类型      

    2024年02月07日
    浏览(64)
  • 【C++】关于常引用的问题 #什么是权限放大?权限放小?隐式或强制转换居然还有这一步?...#

      🧑‍🎓 个人主页:简 料   🏆 所属专栏:C++   🏆 个人社区:越努力越幸运社区   🏆 简       介: 简料简料,简单有料~在校大学生一枚,专注C/C++/GO的干货分享,立志成为您的好帮手 ~ C/C++学习路线 (点击解锁) ❤️ C语言 ❤️ 初阶数据结构与算法 ❤️ C++ ❤️

    2024年02月06日
    浏览(24)
  • 【036】读懂C++的强制类型转换static_cast、const_cast、dynamic_cast以及reinterpret_cast

    💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。 👉 🎖️ CSDN实力新星,社区专家博主 👉 🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、

    2024年02月12日
    浏览(26)
  • [C++]基本知识与概念

    前言 本文章适用于有一定C++基础的新手同学快速掌握一些C++的基本知识概念以及面试中可能会问的内容,如果你没有相应的基础学习又因为这篇文章缺少代码讲解所以可能会影响你的学习效率.内容出自编程书,网上资料以及chatgpt,其中的一些知识也只是我从网络上查来的资

    2024年02月07日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包