文章目录

  • 1.dynamic_cast
  • 2.const_cast
  • 3.3 static_cast
  • 3.4 reinterpret_cast

1.dynamic_cast

用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。要深入了解内部转换的原理。

向上转换:指的是子类向基类的转换
向下转换:指的是基类向子类的转换

它通过判断在执行到该语句的时候变量的运行时类型和要转换的类型是否相同来判断是否能够进行向下转换。

#include<iostream>
#include<stack>
#include<string>
#include<vector>
#include<set>
using namespace std;class A {public:virtual void print() {cout << "A base" << endl;}
};
class B :public A {public:virtual void print() {cout << "B derived" << endl;}
};
int main()
{/*1.dynamic_cast的向上转换子类向父类指针的转化,即ptr_b  ——>  ptr_a,这也是实现虚函数的基础虚函数的子类父类之间的向上转换总是安全的*/B* ptr_b1=new B;A* ptr_a1= dynamic_cast<A*>(ptr_b1);/*B* ptr_b=new B;A* ptr_a=ptr_b;*//*A* ptr_a=new B;*/ptr_a1->print();/*2.dynamic_cast的向下转换父类指针向子类指针的转换向下转换可能不安全*/A* ptr_a2 = new A;B* ptr_b2 = dynamic_cast<B*>(ptr_a2);if (ptr_b2) {cout << "ptr_a2向ptr_b2转换成功" << endl;ptr_b2->print();}else {cout << "ptr_b2为null,ptr_a2向ptr_b2转换失败" << endl;}A* ptr_a3 = new B;//这是向下转换成功的关键B* ptr_b3 = dynamic_cast<B*>(ptr_a3);if (ptr_b3) {cout << "ptr_a3向ptr_b3转换成功" << endl;ptr_b3->print();}else {cout << "ptr_b3为null,ptr_a3向ptr_b3转换失败" << endl;}return 0;
}
B derived
ptr_b2为null,ptr_a2向ptr_b2转换失败
ptr_a3向ptr_b3转换成功
B derived

2.const_cast

用于将const变量转为非const
但需要特别注意的是const_cast不是用于去除变量的常量性,而是去除指向常数对象的指针或引用的常量性,其去除常量性的对象必须为指针或引用。

#include<iostream>
#include<stack>
#include<string>
#include<vector>
#include<set>
using namespace std;int main()
{const int A = 4;const int* ptr1 = &A;int* ptr2 = const_cast<int*>(ptr1);//*ptr2 = 44;如果直接如此,则错误cout << "A=" << A << endl;cout << "*ptr1=" << *ptr1 << endl;cout << "*ptr2=" << *ptr2 << endl;return 0;
}

3.3 static_cast

用于各种隐式转换,比如非const转const,void*转指针等, static_cast能用于多态向上转化,如果向下转能成功但是不安全,结果未知;

3.4 reinterpret_cast

几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用;

为什么不使用C的强制转换?

C的强制转换表面上看起来功能强大什么都能转,但是转化不够明确,不能进行错误检查,容易出错。

C++学习——C++中的四种类型转换相关推荐

  1. 聊聊 C++ 中的四种类型转换符

    一:背景 在玩 C 的时候,经常会用 void* 来指向一段内存地址开端,然后再将其强转成尺度更小的 char* 或 int* 来丈量一段内存,参考如下代码: int main() {void* pt ...

  2. C++四种类型转换总结

    来源:微信公众号「编程学习基地」 文章目录 类型转换 C语言类型转换 C++类型转换 const_cast 去常属性 寄存器骚操作 关键字volatile reinterpret_cast重解释 st ...

  3. 【C++】类型转换简述:四种类型转换方式的说明及应用

    本文主要简述在C++中四种类型转换的方式:static_cast.reniterpret_cast.const_cast和dynamic_cast. 在介绍C++类型转换方式之前,我们先来看看C语言的 ...

  4. AI学习笔记--人机对话的四种形态

    AI学习笔记--人机对话的四种形态 ><div class="show-content-free"><p>最近在筹备转行 AI PM 由于之前的产品线 ...

  5. C++ 四种类型转换

    在写代码中经常会有很多的隐式类型转换或显式类型转换. 对于隐式的类型转换主要是放生在赋值的时候,讲变量赋值给不同类型的变量的时候就会发生类型转换,如果是宽化转换(即从占字节少的类型向占字节多的类型转换 ...

  6. C++/面试 - 四种类型转换(cast)的关键字 详解 及 代码

    四种类型转换(cast)的关键字 详解 及 代码 本文原创, 禁止转载, 如有需要, 请站内联系. 本文地址: http://blog.csdn.net/caroline_wendy/article/ ...

  7. Mysql期初数和期末数_账户中记录四种核算指标,即期初余额、 本期增加发生额、本期减少发生额和期末余额。其关系式包括( )。_学小易找答案...

    [单选题]运算符+* % =中,优先级最低的是( ). (3.0分) [单选题]反映企业所有者投入资金的科目是( ). [单选题]要输出double型的数据,用( ). (3.0分) [单选题]是对形 ...

  8. c++中的四种cast转换, dynamic_cast、static_cast、const_cast、reinterpret_cast

    C++11之后,C++中就有四种类型转换,分别是 dynamic_cast.static_cast.const_cast.reinterpret_cast,一般用这四种强制转换可以替代在c代码中类似( ...

  9. 理解Unity3D中的四种坐标体系

    coffeecato写在前面:本文比较了unity3d中的四种坐标系,在使用unity3d开发的过程中,已经多次被坐标转换之类的问题卡住,这篇文章可以说是系统的对四种坐标系进行了总结,结合实际的使用经 ...

最新文章

  1. Rancher 2.2.2 发布,优化 Kubernetes 集群运维
  2. RHEL 5 密码破解和防止别人通过单用户模式修改密码
  3. 立体匹配之NCC算法
  4. opengl用什么软件写_汇才论文工具分享:写科研论文的都在用这些截图软件
  5. 京东极速版如何取消订单 京东极速版怎样取消订单
  6. LINUX中使用fdisk对SD卡磁盘进行格式化并重新分区
  7. Spring MVC 4 - Hello World Tutorial
  8. 1024. 科学计数法 (20)-PAT乙级真题
  9. ThinkJS 和 Sprite.js 服务端渲染实践
  10. win11改成win7界面的设置方法
  11. Spring Cloud微服务实战_PDF电子书下载 高清 带索引书签目录_翟永超(著)
  12. NTFS权限和文件详解
  13. 一场关于Android的争论
  14. SylixOS 共用中断号机制
  15. jQuery添加元素
  16. 7天物联网智能家居学习记录---第五天
  17. 中国灾害预警爬取解析
  18. 用python制作生日蛋糕_纯HTML5+CSS3制作生日蛋糕(代码易懂)
  19. [YTU](3166)共享单车 ---bfs
  20. 【免费+开源】视频批量分割工具V1.0 - 基于python gui开发

热门文章

  1. LeetCode 1249. 移除无效的括号(栈+set / deque)
  2. LintCode 802. 数独(回溯)/ LeetCode 37. 解数独
  3. LeetCode 51. N皇后 / 52. N皇后 II(回溯)
  4. ubuntu memcached php,如何在 Ubuntu 18.04 上安装 Memcached
  5. 自定义计算器 android,自定义公式计算app下载
  6. .net 5 正式版_.NET 5正式版快来了
  7. Python随机数生成方法
  8. 如何使用 Pylint 来规范 Python 代码风格
  9. Lego-美团接口自动化测试实践
  10. 金融时报:人工智能在银行中的应用—对全球30家大型银行的调查