专栏首页编程技术专栏C++的四种转换(const_cast、static_cast、dynamic_cast、reinterpreter_cast)
原创

C++的四种转换(const_cast、static_cast、dynamic_cast、reinterpreter_cast)

static_cast

相当于C语言中的强制转换:(类型)表达式或类型(表达式),用于各种隐式转换

非const转const、void*转指针、int和char相互转换

用于基类和子类之间的指针和引用转换,非指针直接报错

向上转化是安全的,如果向下转能(指针或引用)成功但是不安全,结果未知;

dynamic_cast

用于动态类型转换。只能用于含有虚函数的类,必须用在多态体系种,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。

在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

如果没有virtual方法进行下行转换(指针或引用)会直接报错

const_cast

常量指针被转化成非常量的指针,并且仍然指向原来的对象;

常量引用被转换成非常量的引用,并且仍然指向原来的对象;

const_cast一般用于修改底指针。如const char *p形式。

const int a=10;
int *p=const_cast<int*>(&a);	//p和a指向同一块内存地址
*p = 100;	//修改*p,但a=10,*p=100

reinterpret_cast

(重解释转换)几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用;随意的转换编译都会通过,但是不安全的转换运行时会异常

错误的使用reinterpret_cast很容易导致程序的不安全,只有将转换后的类型值转换回到其原始类型,这样才是正确使用reinterpret_cast方式。

reinterpret_cast不能转换掉表达式的const

可以用在将void*转换为int类型

unsigned short Hash( void *p ) {
   unsigned int val = reinterpret_cast<unsigned int>( p );
   return ( unsigned short )( val ^ (val >> 16));
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • const关键字总结

    被const修饰的变量是不能改变的 const修饰变量时,必须在声明变量的同时给出初始化(类中的const成员变量不一样)

    WindSun
  • const与#define的区别、优点

    补充:预处理器根据以#开头的命令,修改原始的程序。比如我们常见的#include <stdio.h>命令告诉处理器读取系统头文件stdio.h的内容,并把它直接...

    WindSun
  • C++指针和引用及区别

    首先最重要的,variable的定义,当你申明一个变量的时候,计算机会将指定的一块内存空间和变量名进行绑定;这个定义很简单,但其实很抽象,例如:int x = ...

    WindSun
  • C++中四种类型转换以及const_cast是否能改变常量的问题

    we have four specific casting operators:dynamic_cast, reinterpret_cast, static_c...

    s1mba
  • 站在数字货币的“风口” 欧洲央行要招一位区块链专家

    摘要:数字货币早已成为各大央行眼中的“风口”,欧洲央行则在圣诞节前开始招兵买马。这一职位的工资是年薪8万欧元,倾向于女性,工作地点在德国法兰克福,不过,只面向欧...

    企鹅号小编
  • Data Structures and Algorithms Basics(018):总结

    上面是该系列(数据结构与算法基础)的目录结构,包含了常见的数据结构和算法,下面介绍三大算法(分治算法,动态规划,贪心算法)的核心思想及使用场景。

    用户5473628
  • 如何让Jupyter Notebook支持多种编程语言?

    不满意Jupyter Notebook只有Python 2环境,还打算让它支持Python 3与R?没问题,本文一步步帮助你实现这个愿望。

    王树义
  • js 数组封装方法实现类似sql的groupBy分组求和。

    易兒善
  • SpringBoot

    @Component是Spring中用于描述Bean类的一个注解。当此对象由Spring创建和管理时,默认会将对象存储到池(Bean池)中。

    用户7411014
  • Jupyter与PyCharm不可兼得?Jupytext就是你需要的!

    Jupyter Notebook 是一款免费、开源的交互式 web 工具。研究人员可以利用该工具将软件代码、计算输出、解释文本和多媒体资源组合在一个文档中。笔记...

    用户2769421

扫码关注云+社区

领取腾讯云代金券