详解C++中常用的四种类型转换方式

 更新时间:2022年08月18日 17:02:04   作者:lhb2998658795  
这篇文章主要为大家详细介绍了C++中常用的四种类型转换方式:static_cast<Type>、dynamic_cast<Type>、const_case<Type>和reinterpret_cast,感兴趣的可以了解一下

1.静态类型转换:static_cast(exp)

1.1静态类型转换主要用于两种转换环境

1.1.1 C++内置类型的转换:与C风格强转类似。

与c相同的地方:

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

不同的地方就是使用static_cast不能强转内置类型指针的,这点可以避免C风格中的越界问题。

如图所示:

1.1.2当有继承关系存在时的强转:

如果使用static_cast 由子类向父类转型,向上转型,天然安全安全。(应为子类的空间肯定比父类的空间大,子类是在继承父类的空间上面开辟),代码如下:

#include <iostream>
 
using namespace std;
 
class A
{
public:
    int a=100;
 
    void Ashow_info()
    {
        cout<<this->a<<endl;
    }
};
 
class B:public A
{
public:
    int a=200;
    int b=300;
    int c=400;
    void Bshow_info()
    {
        cout<<this->a<<this->b<<this->c<<endl;
    }
};
 
 
int main()
{
   B* a=new B;
   static_cast<A*>(a)->Ashow_info();
 
    return 0;
}

结果图:

我们可以通过子类安全的访问到父类中的a值。

如果使用static_cast 由父类向子类转型,向下转型,是不安全。

那么何时不安全?何时安全?

不安全的情况介绍:

#include <iostream>
 
using namespace std;
 
class A
{
public:
    int a=100;
 
    void Ashow_info()
    {
        cout<<this->a<<endl;
    }
};
 
class B:public A
{
public:
    int a=200;
    int b=300;
    int c=400;
    void Bshow_info()
    {
        cout<<this->a<<this->b<<this->c<<endl;
    }
};
 
 
int main()
{
   A* a=new A;
   static_cast<B*>(a)->Bshow_info();
 
    return 0;
}

结果图:

如图所示结果中并没有出现本应该打出的200,300,400,这就是不知道子类空间是否被开辟而向下访问造成的结果。

安全的情况:

#include <iostream>
 
using namespace std;
 
class A
{
public:
    int a=100;
 
    void Ashow_info()
    {
        cout<<this->a<<endl;
    }
};
 
class B:public A
{
public:
    int a=200;
    int b=300;
    int c=400;
    void Bshow_info()
    {
        cout<<this->a<<this->b<<this->c<<endl;
    }
};
 
 
int main()
{
   A* a=new B;
   static_cast<B*>(a)->Bshow_info();
 
    return 0;
}

结果图:

如图所示,此时我们可以打出200,300,400,等数值,说明当我们知道子类空间被开辟时候,就可以安全的向下访问。

2.动态类型转换:dynamic_cast(exp)

2.1概念

动态类型转换是依赖于虚函数的与继承关系,没有虚函数,就无法使用动态类型转换。dynamic_cast是一个安全类型转换,因为他是依赖于函数实现动态转型。因为虚表中的第一个Slot位置保存了类型运行识别信息。

注意使用的条件为:1)要有继承关系 2)要有虚函数。

这个虚表的结构:

2.2代码举例说明

#include <iostream>
 
using namespace std;
 
class A
{
public:
 
 
    virtual void show_info()
    {
        cout<<"我是父亲"<<endl;
    }
};
 
class B:public A
{
public:
 
    void show_info()
    {
        cout<<"我是儿子"<<endl;
    }
};
 
 
int main()
{
   A* a=new B;
   dynamic_cast<B*>(a)->show_info();
 
    return 0;
}

结果图:

3.常类型转换:const_case(exp)

就是用来修改const修饰的常引用和常指针的转换方式

3.1代码说明

#include <iostream>
 
using namespace std;
 
int main()
{
    const int& a=100;
 
    const_cast<int&>(a)=200;
 
    cout<<a<<endl;
 
 
    return 0;
}

结果图:

由图可知我们修改了常引用的数值。

4. 解释类型转换: reinterpret_cast(exp)

4.1概念

这要类型转换方式,是可以庆用于任何类型,他的底层的实现就是对底层二进制数据的一个拷贝。所以也是一个不安全的强转。

4.2由于这个一般都不用,从我们最有可能的会用到的情况下抽出来一种,代码如下:

当我们想把一个数的地址,用10进制的表达出来的时候,如下,光一个int 是装不下地址的十进制,所以系统就会给我们报错。

 这个时候reinterpert_cast就起到了作用,我们可以把他转为long long类型,如下:

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

结果图:

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

相关文章

  • 如何用c语言完成俄罗斯方块小游戏

    如何用c语言完成俄罗斯方块小游戏

    这篇文章主要介绍了如何使用C语言开发一个简单的俄罗斯方块游戏,涵盖了游戏设计、数据结构、核心逻辑和实现步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • Qt常用容器类的使用

    Qt常用容器类的使用

    本文主要介绍了Qt常用容器类的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C/C++ 数组和指针及引用的区别

    C/C++ 数组和指针及引用的区别

    这篇文章主要介绍了C/C++ 数组和指针及引用的区别的相关资料,这里从汇编的角度来分析他们之间的区别,需要的朋友可以参考下
    2017-07-07
  • 最新clion2020激活码附安装教程(亲测有效)

    最新clion2020激活码附安装教程(亲测有效)

    这篇文章主要介绍了最新clion2020激活码附安装教程(亲测有效),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Qt实现发送HTTP请求的示例详解

    Qt实现发送HTTP请求的示例详解

    这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-03-03
  • Qt中关联容器QMap,QMultiMap,QHash,QMultiHash的使用

    Qt中关联容器QMap,QMultiMap,QHash,QMultiHash的使用

    本文主要介绍了Qt中关联容器QMap,QMultiMap,QHash,QMultiHash的使用,这些关联容器在Qt中提供了灵活而强大的数据结构选项,根据具体的需求和使用场景,您可以选择适合的容器来存储和管理数据,感兴趣的可以了解一下
    2023-09-09
  • C语言基础野指针与空指针示例分析

    C语言基础野指针与空指针示例分析

    全网最接地气的C语言野指针介绍,此处对于野指针与空指针知识点做一些简要的介绍,作者实属初学,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,希望大家多多给予支持
    2021-11-11
  • C语言预处理详解

    C语言预处理详解

    这篇文章主要给大家介绍了关于C语言之预处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-10-10
  • c语言生成随机uuid编码示例

    c语言生成随机uuid编码示例

    这篇文章主要介绍了c语言生成随机uuid编码示例,需要的朋友可以参考下
    2014-05-05
  • C++实现stack与queue数据结构的模拟

    C++实现stack与queue数据结构的模拟

    stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作;队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素
    2023-04-04

最新评论