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));
}

C++的四种转换(const_cast、static_cast、dynamic_cast、reinterpreter_cast)的更多相关文章

  1. C++中四种转换类型的区别

    一.四种转换类型比较: 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可 ...

  2. 你也许还不知道const_cast,static_cast,dynamic_cast,reinterpret_cast的区别吧?

    [QQ群: 189191838,对算法和C++感兴趣可以进来]       开篇立意: C++中各种转换令人眼花缭乱,看似差不多,实际差很多,而且在当今时间,做一个"差不多先生"其 ...

  3. C++语言基础(24)-四种类型转换运算符(static_cast、dynamic_cast、const_cast和reinterpret_cast)

    一.static_cast static_cast 只能用于良性转换,这样的转换风险较低,一般不会发生什么意外,如: #include <iostream> #include <cs ...

  4. 【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)

    强制类型转换 1. static_cast 2. dynamic_cast 3. const_cast 4. reinterpret_cast 5. 为什么要需要四种类型转换? 1. static_c ...

  5. C++中的四种类型转换运算符static_cast、dynamic_cast、const_cast和reinterpret_cast的使用

    1.上一遍讲述了C语言的隐式类型转换和显示类型转换,C语言之所以增加强制类型转换,就是为了强调转换的风险性,但这种强调风险的方式是比较粗放了,粒度比较大,它并没有表明存在什么风险,风险程度如何. 2. ...

  6. C++中的四种强制类型转换符详解

    阅读目录 C++即支持C风格的类型转换,又有自己风格的类型转换.C风格的转换格式很简单,但是有不少缺点的: 转换太过随意,可以在任意类型之间转换.你可以把一个指向const对象的指针转换成指向非con ...

  7. C++四种强制类型转换关键字

    C语言使用强制类型转换(Type Cast)很简单,不管什么类型的转换,形式都如下: TYPE b = (TYPE)a; c++提供了4种类型转换操作符来应对不同场合的应用. const_cast   ...

  8. C++四种强制转换

    C++的四种强制类型转换,所以C++不是类型安全的.分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast 为什么使用C风格的强制 ...

  9. C++ 四种类型转换

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

随机推荐

  1. react-native构建基本页面2---轮播图+九宫格

    配置首页的轮播图 轮播图官网 运行npm i react-native-swiper --save安装轮播图组件 导入轮播图组件import Swiper from 'react-native-swi ...

  2. react-父子子孙组件嵌套-context

    方案一 import React from 'react' import ReactTypes from 'prop-types' /* // 最外层的父组件 export default class ...

  3. python3爬取淘宝商品(失效)

    最近有人反映淘宝的搜索功能要登录才能用,原先的直接爬取的方法挂了.稍微把之前的代码修改了一下,登录采用最简单的复制cookie来解决. 顺便说一下,这只是根据搜索的的索引界面获取的信息,并未深入的获取 ...

  4. contos7 用户管理相关操作命令

    # 查看用户列表 cut -d : -f 1 /etc/passwd # 查看可以登录系统的用户 cat /etc/passwd | grep -v /sbin/nologin | cut -d : ...

  5. 删除在wireshark中保存的filter的方法

    现在想删除下图的filter,方法是:Edit->preferences->Filter Expressions

  6. windows 环境变量%SystemDrive%和%SystemRoot%、%AppData%、%LocalAppData%、%TEMP% 等简写

    windows 环境变量%SystemDrive% 和%SystemRoot%.%AppData%.%LocalAppData%.%TEMP% 等简写 假设操作系统安装在 C: 盘 %SYSTEMRO ...

  7. IDEA的Debug模式灰色无法运行

    1. 检查本地环境是否配置得当,进入项目右键看项目是否可以正常debug运行 2.  如果不可运行,那么选择File--Project Structrue 3. 修改Src文件,如图然后就可以正常使用 ...

  8. Babel 7 主要改变

    1.不支持Node:0.10,0.12,4,5版本 2.更换命名-@babel/xxx 3.移除以年份命名的presets,统一更换成@babel/preset-env 4.移除 ’Stage‘ pr ...

  9. grep/sed/awk命令查看指定时间段的日志

    *grep命令 今天遇到研发要求查询定时任务(elastic-job)在14:00-14:40的日志,使用grep命令很方便: 命令: grep '时间' '日志文件名 ' 1.例如查询2020-02 ...

  10. 502. IPO(最小堆+最大堆法 or 排序法)

    题目: 链接:https://leetcode-cn.com/problems/ipo/submissions/ 假设 力扣(LeetCode)即将开始其 IPO.为了以更高的价格将股票卖给风险投资公 ...