当前位置: 首页 > news >正文

【C++】C++四种类型转换方式

        在C语言中我们使用了类型强转:

int a = (int)b;

        C++语言级别提供了四种类型转换方式。

为什么 C++ 需要四种类型转换
C 风格的转换格式很简单,但是有不少缺点的:
1. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
2. 显式类型转换将所有情况混合在一起,代码不够清晰
因此 C++ 提出了自己的类型转化风格,注意 因为 C++ 要兼容 C 语言,所以 C++ 中还可以使用 C 语言的
转化风格

1.const_cast 

        去掉常量属性的一个类型转换。

const int a = 10;int *p1 = (int*)&a;int *b = const_cast<int*>(&a);

 const_cast<这里面必须是指针或者引用类型>

2.static_cast

        提供编译器认为安全的类型转换。

        我们使用百分之八九十的类型转换都是使用static_cast来进行类型转换的

        几乎能做任何类型的转换,但是只能做编译器认为安全的类型转换。

const int a = 10;
int* p1 = (int*)&a;
int* p2 = const_cast<int*>(&a);*//*int* p = nullptr;
double* p2 = static_cast<double*>(p);*/	// 这两个类型没有关联,无法进行类型转换
// int是四个字节,double是八个字节,转换后操作的内存变为八个,不安全。

 基类类型 《=》 派生类类型,能不能用static_cast进行类型转换?

可以,基类和派生类有关联。

如果我们非要强制转换,我们可以使用reinterpret_cast来进行强制转换,但是这是不安全的。

3.reinterpret_cast

        类似于C风格的强制类型转换(可能会不安全)。

4.dynamic_cast

        主要用在继承结构中,可以支持RTTI类型识别的上下转换。

#include <iostream>class Base
{
public:virtual void func() = 0;
private:
};class Derive1 : public Base
{
public:void func(){std::cout << "call Derive1::func" << std::endl;}
};class Derive2 : public Base
{
public:void func(){std::cout << "call Derive2::func" << std::endl;}// Derive实现新功能的API接口函数void derive02func(){std::cout << "call Derive2::derive02func" << std::endl;}
};void showFunc(Base* p)
{// dynamic_cast会检查p指针是否指向的是一个Derive2类型的对象// p -> vfptr -> vftable RTTI信息,如果是,dynamic_cast转换类型成功// 返回Derive2对象的地址,给pd2;否则返回nullptrDerive2* pd2 = dynamic_cast<Derive2*>(p);if (pd2 != nullptr){pd2->derive02func();}else{p->func();	// 动态绑定		*p的类型 如果指向Derive2对象,调用derive02func函数}
}int main()
{Derive1 d1;Derive2 d2;showFunc(&d1);showFunc(&d2);return 0;
}

dynamic_cast会检查p指针是否指向的是一个Derive2类型的对象
 p -> vfptr -> vftable RTTI信息,如果是,dynamic_cast转换类型成功
返回Derive2对象的地址,给pd2;否则返回nullptr

 static_cast也能进行,但是他会把所有的都转换成Derive2类型,如果要访问Derive2里面的成员变量,就会出错。

dynamic_cast 用于将一个父类对象的指针 / 引用转换为子类对象的指针或引用 ( 动态转换 )
向上转型:子类对象指针 / 引用 -> 父类指针 / 引用 ( 不需要转换,赋值兼容规则 )
向下转型:父类对象指针 / 引用 -> 子类指针 / 引用 ( dynamic_cast 转型是安全的 )
注意:
1. dynamic_cast 只能用于父类含有虚函数的类
2. dynamic_cast 会先检查是否能转换成功,能成功则转换,不能则返回 0

http://www.mrgr.cn/news/66119.html

相关文章:

  • 叉车智能管理系统,简化现场管理!
  • Java8->Java19的初步探索
  • 第二十八章 Vue之自定义指令
  • 进度条的实现(配合make和makefile超详细)
  • 计算机毕业设计——ssm基于java智能选课系统的设计与实现演示录像2021
  • ubuntu20.04 加固方案-检查是否设置登录超时
  • 配电室、变电所电力监控系统-实时监测各回路电参数信息
  • PHP查询实时股票行情
  • 解读《ARM Cortex-M3 与Cortex-M4 权威指南》——第3章 技术综述
  • 2024年11月4日Day4
  • Python中的HTTP请求处理:从基础到高级应用
  • ssm058基于Java的共享客栈管理系统+jsp(论文+源码)_kaic
  • Python实现FTP服务器:从入门到实践
  • 性能测试:主流性能剖析工具介绍
  • 嵌入式音视频开发面试题:如何优化画面质量?
  • 「实战应用」如何用图表控件LightningChart .NET在WPF中制作表格?(一)
  • 进制转换-洛谷B2143
  • 微服务day03
  • PDA智能巡检管理
  • c++基础13if
  • FloodFill 算法 专题
  • springboot家居商城-计算机毕业设计源码02059
  • 正弦波形在示波器上“跑动”的原因及解决办法
  • 【MySQL】存储过程
  • 新160个crackme - 092-FaNtOm-crackme6
  • LeetCode 3222.求出硬币游戏的赢家:伪博弈真思维O(1)