C++类型转换

  • C语言风格的类型转换符
  • const_cast
  • dynamic_cast
  • static_cast
  • reinterpret_cast
  • 总结

C语言风格的类型转换符

C 语言风格的类型转换符无需多说,下面两种方式都可以,也是平时用的最多转换符,没有什么特点,就是单纯的将某个类型转成另一个类型。后面讲到每个 C++ 的转换都会与 C 语言风格转换进行对比。

int integer = 10;
double double1 = (int)integer;
double double2 = int(integer);

const_cast

const_cast 一般用于去除 const 属性,将 const 转换成非 const 。
C 语言风格强转也可以达到这个效果,并且与 const_cast 在使用效果上没有任何区别(通过观察底层汇编可知)。

#include <iostream>
using namespace std;struct Person {int m_age;
};int main() {const Person *p1 = new Person();// p1->m_age = 20; // p1是常量,无法修改Person *p2 = const_cast<Person *>(p1); // const_cast 去 constp2->m_age = 20; // 去除了const,可以修改Person *p3 = (Person *)p1;     // C语言风格强转也可以,使用效果没有任何区别p3->m_age = 20; // 去除了const,可以修改return 0;
}

如何通过观察底层汇编得出结论?
首先,给程序打个断点,进入调试,然后右键选择反汇编(Alt + G)查看汇编:

观察汇编可知,const_cast 相比 C语言风格强转没有多做任何事情,它的意义主要在于见名知意

dynamic_cast

  • 一般用于多态类型的转换,有运行时安全检测

dynamic_cast,有运行时安全检测,检测到不安全的转化,则会将地址变为NULL。而 C 语言风格转化没有安全检测,即使不安全依旧可以强转。

#include <iostream>
using namespace std;class Person {virtual void run() {}
};class Student : public Person {};int main() {Person *p1 = new Person();Person *p2 = new Student(); // 父类指针指向子类对象// dynamic_cast,有运行时安全检测// 检测到不安全的转化,则会将地址变为NULLStudent *stu1 = dynamic_cast<Student *>(p1); // 不安全,地址变为NULLStudent *stu2 = dynamic_cast<Student *>(p2); // 安全// C语言风格转化没有安全检测,即使不安全依旧可以强转Student *stu3 = (Student *)p1; // 不安全,依旧可以转Student *stu4 = (Student *)p2; // 安全cout << "stu1 = " << stu1 << endl; // 00000000cout << "stu2 = " << stu2 << endl; // 00DC0430cout << "stu3 = " << stu3 << endl; // 00DB6C20cout << "stu4 = " << stu4 << endl; // 00DC0430return 0;
}

static_cast

  • 对比 dynamic_cast ,缺乏运行时安全检测
  • 不能交叉转换(不是同一继承体系的,无法转换)
  • 常用于基本数据类型的转换、非 const 转成 const
  • 适用范围较广(但是用的很少)
#include <iostream>
using namespace std;class Person {virtual void run() {}
};class Student : public Person {};class Car {};int main() {Person *p1 = new Person();const Person *p2 = p1; // 不写也会进行隐式转换int a = 10; // 基本数据类型的转换double d = static_cast<double>(a); // 效果与C语言风格转换没有任何区别// dynamic_cast 没有交叉转换的限制Car *c1 = dynamic_cast<Car *>(p1);// static_cast 不能交叉转换// Car *c2 = static_cast<Car *>(p1); // 报错,Person与Car毫无关联,无法转换return 0;
}

reinterpret_cast

  • 属于比较底层的强制转换,没有任何类型检查和格式转换,仅仅是简单的二进制数据拷贝
  • 可以交叉转换
  • 可以将指针和整数互相转换
#include <iostream>
using namespace std;class Person {virtual void run() {}
};class Student : public Person {};class Car {};int main() {Person *p1 = new Person(); Person *p2 = new Student(); // 父类指针指向子类对象// 怎么样都能转,但是由于转换是二进制数据的拷贝// 转换结果往往我们想的不一样(差别极大)// 要达到我们所想的目的,往往采用C语言风格的强转Student *stul = reinterpret_cast<Student *>(p1); Student *stu2 = reinterpret_cast<Student *>(p2); Car *car = reinterpret_cast<Car*>(p1); int *p = reinterpret_cast<int *>(0x100); int num = reinterpret_cast<int>(p); int i = 10; // 这里就是要写成 <double &>,语法规定,no whydouble d1 = reinterpret_cast<double &>(i);getchar();return 0;
}

总结

C++ 虽然提供了 4 种转换方式,但是平时用的最多就是C语言风格的强转
这 4 种方式主要是见名知意,而 C语言风格只知道是强转,具体谁转谁需要上下代码。
不使用 C++ 风格的转换方式对程序来说没有任何影响。
C++ 提供的转换方式要求不高,认识即可。

【C++】类型转换(const_cast、dynamic_cast、static_cast、reinterpret_cast)相关推荐

  1. C++类型转换运算符 static_cast,dynamic_cast,reinterpret_cast,const_cast

    类型转换是一种让程序猿可以临时或永久性改变编译器对对象的解释机制.可改变对象解释方式的运算符称为类型转换运算符. 为何须要进行类型转换 通常为了实现使用不同环境的个人和厂商编写的模块可以相互调用和协作 ...

  2. c++ 数据类型转换: static_cast、dynamic_cast、reinterpret_cast和const_cast

    [目录] 引言 static_cast 定义 dynamic_cast 定义 举例:下行转换(把基类的指针或引用转换成子类表示) 举例:上行转换(把子类的指针或引用转换成基类表示) 举例: stati ...

  3. C++基础——C++风格的类型转换(static_cast、const_cast、dynamic_cast、reinterpret_cast)

    static_cast const_cast dynamic_cast reinterpret_cast References 类型转换是一个笼统.模糊的词,对应着C语言类型转换的粗粒度特性. C++ ...

  4. C++ 强制类型转换操作符(static_cast、dynamic_cast、const_cast和reinterpret_cast)

    C++中的四种操作符形式类型转换 1.static_cast (静态类型转换) 主要使用场景:适用于将void*转换为其他的指针 int a = 100; void* pv = &a; //i ...

  5. C++ 类型转换(static_cast、dynamic_cast、reinterpret_cast、const_cast)

    C++ 类型转换 C语言的类型转换 C++的类型转换 static_cast const_cast reinterpret_cast dynamic_cast RTTI dynamic_cast 和 ...

  6. 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast(转载)

    C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的 ...

  7. 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast

    C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的 ...

  8. C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用

    C风格的强制转换较简单,如将float a转换为int b,则可以这样:b = (int)a,或者b=int(a). C++类型转换分为隐式类型转换和显示类型转换. 隐式类型转换又称为标准转换,包括以 ...

  9. C++中四种类型转换方式(ynamic_cast,const_cast,static_cast,reinterpret_cast)

    Q:什么是C风格转换?什么是static_cast, dynamic_cast 以及 reinterpret_cast?区别是什么?为什么要注意? A:转换的含义是通过改变一个变量的类型为别的类型从而 ...

  10. static_cast、dynamic_cast、reinterpret_cast、const_cast[转]

    C-style cast举例: int i; double d; i = (int) d; 上面的代码就是本来为double类型的d,通过(int)d将其转换成整形值,并将该值赋给整形变量i (注意d ...

最新文章

  1. calcite连接mysql_使用Calcite做Sql语法解析
  2. 运放放大倍数计算公式_19.运算放大器的特性与应用,不得不掌握的知识点(一)...
  3. java amf3_Java AMF3 反序列化漏洞分析
  4. 使用networkx求解网络的平均度
  5. 没想到你是这样的Nginx!
  6. 笔记-js高程-第七章 函数表达式
  7. 【语音分析】基于matlab语音短时频域分析【含Matlab源码 558期】
  8. typec扩展坞hdmi没反应_HDMI+两个USB接口,让surface秒变办公神器?这个扩展坞真香...
  9. winform窗体界面闪烁解决办法
  10. 移动通信学习笔记03_蜂窝原理
  11. 分析图书管理系统的5W1H
  12. office 论文 页码_原创:如何设置毕业论文的页眉和页码(word2007和word2010)
  13. excel自动填充脚本(awk)
  14. 6-29 水上飞机(*) (20分)多重继承
  15. python爬取QQ空间好友说说并生成词云
  16. 第8天-信息收集——站点搭建,WAF等
  17. 苹果iOS7 Beta 2版系统下载,ios7beta2固件下载
  18. Overleaf LaTex 学习(一):页边距设置与matlab代码
  19. web课程设计网页规划与设计 基于HTML+CSS+JavaScript制作智能停车系统公司网站静态模板
  20. Oracle拼音码函数(不过字库不全,普通能满足)

热门文章

  1. 巴菲特三季度赚301亿美元
  2. 是什么让Go语言更适合人工智能研究?
  3. 二十年前的电脑配置单,大家见过吗?
  4. 【以太坊源码】mpt实现
  5. SSM中异常的几种处理方式
  6. sql学习指南_SQL格式功能的全面指南
  7. vlf 用法_什么是SQL虚拟日志文件(又名SQL Server VLF)?
  8. 缓存 负载均衡_使用“针对临时工作负载优化”选项来保存计划缓存存储
  9. 如何使用SQL Server配置管理器
  10. 编写SQL Server数据库对象脚本的方法