一.强制类型转换

C++语言中提供了static_cast、const_cast、reinterpret_cast和dynamic_cast。这四个关键字都是用于强制类型转换的。

二.static_cast

1.基本数据之间的转换,如int转化为double

int a = 1;
double b = static_cast<double>(a);

2.用于类层次结构中基类和派生类之间指针或引用的转换
①进行上行转换(把派生类的指针或引用转换成基类表示)是安全的
②进行下行转换(把基类的指针或引用转换为派生类表示),由于没有动态类型检查,所以是不安全的

//写两个类,假如 Derive类继承Basic
Basic *b = nullptr;
Derive *d = new Derive;
b = static_cast<Basic *> d;

3.把空指针转换成目标类型的空指针

int *p;
void *m = malloc(sizeof(int));
p = static_cast<int *>m;

4.把任何类型的表达式转换为void类型

三.const_cast

cost_cast即用于强制转换指针或者引用的const或volatile限制,特别注意的是,const_cast不是用于去除变量的常量性,而是去除指向常数对象的指针或引用的常量性,其去除常量性的对象必须为指针或引用。

//错误例子
const int a = 2;
int b = const_cast<int>a;        //错误,const_cast强制转换的对象必须是指针或引用//正确例子
int c = 2;
const int *d = &c;
int *e = const_cast<int *>d;

四.reinterpret_cast 

reinterpret_cast运算符用于处理无关类型之间的转换,他会产生一个新的值,这个值会有与原始参数(原数据类型)有完全相同的比特位。

1.从指针类型到一个足够大的整数类型

2.从整数类型或者枚举类型到指针类型

3.从一个指向函数的指针到另一个不同类型的指向函数的指针

4.从一个指向对象的指针到另一个不同类型的指向对象的指针

5.从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针

6.从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针

五.dynamic_cast

1.前面三种都是编译时完成的强制转换,dynamic_cast是运行时处理的。

2.不能用于内置的基本数据类型的强制转换。

3.dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。

4.使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。

5.在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

使用dynamic_cast进行向下强制类型转换。使用此关键字有以下几个条件:

①.必须有虚函数

②.必须打开编译器的RTTI开关

③.必须有继承关系

C++ 强制类型转换相关推荐

  1. 自动类型转换和强制类型转换

    自动类型转换: 在Java中,任何情况下,整数类型的字面值默认当成int类型处理 小容量可以自动转换成大容量,这种操作被称为自动类型转换 容量大小的定义: 容量大小不是指数据类型的字节数,而是指这个数 ...

  2. As与强制类型转换的区别以及Is运算符的使用

    前言: 开发人员经常需要将一个对象从一个类型转换成其他类型. 在c#中,类型转换按照转换方式分类分为了隐式转换和显式转换,按对象分类又分为了值类型转换和引用类型转换 CLR(参考:http://bai ...

  3. 重载new、delete和强制类型转换运算符()

    1.重载new和delete运算符 内存管理运算符new.new[].delete和delete[]也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就 ...

  4. C++中的向上类型转换和向下类型转换+四种强制类型转换

    转自博客:http://blog.csdn.net/wangweitingaabbcc/article/details/7720979# 在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分 ...

  5. 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]

    一.栈和托管堆 通用类型系统(CTS)区分两种基本类型:值类型和引用类型.它们之间的根本区别在于它们在内存中的存储方式..NET使用两种不同的物理内存块来存储数据-栈和托管堆.如下图所示:     值 ...

  6. 《你不知道的JavaScript》整理(六)——强制类型转换

    JavaScript中通常分为两种类型转换,"隐式强制类型转换"(implicit coercion)和"显式强制类型转换"(explicit coercion ...

  7. C++编程进阶4(C++中的强制类型转换运算符、不要返回自定义类内部成员的指针,引用和迭代器)

    十五.C++中的强制类型转换 C语言中的强制类型转换方式有两种 T i = (T)exp; T i = T(exp); 这两种方式没有差别,C++中也支持这两种方式,但是和C++中的强制类型转换运算符 ...

  8. static_cast与c风格的强制类型转换比较

    class A {int a; };class B {int b; };class C : public A {int c; };int main() {B b;C c;A* p1 = (A*) &a ...

  9. 初学python-字符串中引号的使用、input简介、强制类型转换、加减乘除简写、条件判断...

    一.字符串中单引号和双引号的使用: 1.字符串以英文单引号' '引用.eg:'Hello World' 2.若字符串中含有单引号,则以英文双引号" "引用.eg:"I'm ...

  10. C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

最新文章

  1. 深圳网络推广提醒大家做好URL标准化,网站排名“事半功倍”!
  2. rsync 断点续传
  3. 2019ICPC(南昌) - Hello 2019(动态规划+线段树维护矩阵)
  4. 基于SpringBoot,SpringSession和redis的会话共享
  5. apache php 3秒,php版本(5.3,5.5,7.0)及运行模式(fast-cgi/fpm,apache模块)之间性能对比测试...
  6. Maven常用命令-创建Java项目
  7. 安装grunt-browser-sync时报错:“未能加载Visual C++ 组件 “VCBuild.exe”
  8. tornado 重定向404
  9. C#扩展方法奇思妙用高级篇一:改进 Scottgu 的 In 扩展
  10. json 字符串和json对象之间相互转换
  11. python安装及运行环境_Python 安装及环境搭建
  12. 错误empty character constant的解决办法
  13. IBM X3650M4服务器拆机风扇 69Y5611 94Y6620 GFC0812DS 线序
  14. tiny4412 uboot 2020.10版本移植(三)——uboot初步启动
  15. Java通用数据访问层 Uncode-DAL
  16. 多个excel表合并成一个excel表
  17. easyui datagrid deleteRow(删除行)的BUG
  18. 如何查看本机ip地址和端口,以及关闭占用端口的进程
  19. ServU的内网架设注意项
  20. 爱好-文化-冢-象冢:《最后一头战象》沈石溪

热门文章

  1. 深度学习基础之-1.6均方差损失(MSE)
  2. Git clone Access denied Authentication failed
  3. 西工大计算机博士好难毕业,老牌985西北工业大学的毕业生最后怎样了?1/3留陕西,月薪7000+...
  4. 计算机博士留校好还是去企业好,博士毕业,是进入知名国企发展好,还是进入大学当老师更好?...
  5. 数据清洗-工业大数据
  6. 论文阅读:Noise-Resilient Training Method for Face Landmark Generation From Speech
  7. 【照虎画猫】京东首页商品菜单列表的实现
  8. 配置NAT模式的网络连接
  9. 无盘服务器 安装客户机程序,无盘快速安装指南
  10. 地铁漏洞之暗黑调度及安全解决方案