精选文章 C++提供了四个转换运算符:const_cast,static_cast,reinterpret_cast

C++提供了四个转换运算符:const_cast,static_cast,reinterpret_cast

作者:sun007700 时间: 2020-08-05 05:33:31
sun007700 2020-08-05 05:33:31

 

https://blog.csdn.net/TanJiaLiang_/article/details/83992337

用const_cast来去除const限定

于是const_cast就出来消灭const,以求引起程序世界的混乱。

下边的代码就顺利编译功过了: const int constant = 21;
const int* const_p = &constant;
int* modifier = const_cast(const_p);
*modifier = 7;

 

reinterpret_cast语法:reinterpret_cast(expression)

reinterpret_cast:允许将任何指针转换为任何其他指针类型。也允许将任何整数类型转换为任何指针类型以及反向转换。

滥用reinterpret_cast运算符可能很容易带来风险。除非所需转换本身是低级别的,否则应使用其他强制转换运算符之一。

reinterpret_cast运算符可用于char*到int*或One_class*到Unrelated_class*之类的转换,这本身并不安全。

reinterpret_cast的结果不能安全地用于除强制转换回其原始类型以外的任何用途。在最好的情况下,其他用途也是不可移植的。

reinterpret_cast运算符不能丢掉const、volatile或__unaligned特性。

reinterpret_cast运算符将null指针值转换为目标类型的null指针值。

reinterpret_cast的一个实际用途是在哈希函数中,即,通过让两个不同的值几乎不以相同的索引结尾的方式将值映射到索引。

reinterpret_cast通常为运算对象的位模式提供较低层次上的重新解释。reinterpret_cast本质上依赖机器。要想安全地使用reinterpret_cast必须对涉及的类型和编译器实现转换的过程都非常了解。

        auto* header = reinterpret_cast(ptr);

 

static_cast语法:static_cast(expression)

static_cast:仅根据表达式中存在的类型,将expression转换为type-id类型。此运算符可用于将指向基类的指针转换为指向派生类的指针等操作。此类转换并非始终安全。

通常使用 static_cast 转换数值数据类型,例如将枚举型转换为整型或将整型转换为浮点型,而且你能确定参与转换的数据类型。 static_cast转换安全性不如dynamic_cast转换,因static_cast不执行运行时类型检查,而dynamic_cas执行该检查。对不明确的指针的 dynamic_cast将失败,而static_cast的返回结果看似没有问题,这是危险的。尽管 dynamic_cast转换更加安全,但是dynamic_cast只适用于指针或引用,而且运行时类型检查也是一项开销。dynamic_cast 和static_cast运算符可以在整个类层次结构中移动指针。然而,static_cast完全依赖于转换语句提供的信息,因此可能不安全。

static_cast可以反向执行隐式转换,可用于任何隐式允许的转换类型,而在这种情况下结果是不确定的。这需要程序员来验证static_cast转换的结果是否安全。

static_cast可用于将int转换为char。但是,得到的char可能没有足够的位来保存整个int值。同样,这需要程序员来验证static_cast转换的结果是否安全。

static_cast运算符还可用于执行任何隐式转换,包括标准转换和用户定义的转换。

static_cast 运算符可以将整数值显式转换为枚举类型。如果整型值不在枚举值的范围内,生成的枚举值是不确定的。

static_cast运算符将null指针值转换为目标类型的null指针值。

任何表达式都可以通过static_cast运算符显式转换为void类型。目标void类型可以选择性地包含const、volatile或__unaligned特性。

static_cast运算符无法转换掉const、volatile或 __unaligned特性。

只有在确信代码将正常运行的时候,在性能关键代码中使用 static_cast。如果必须在发布模式下使用static_cast,请在调试版本中用 safe_cast(C++ 组件扩展)替换它以确保成功。

任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。

            if (len < static_cast(ptr - data) + 4)

 

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:手写mybatis框架(一)通过动态代理简单实现查询功能

下一篇:膨胀定压补水装置安装使用中央空调系统为什么要安装?

您可能感兴趣

  • 【准备面试 DAY1】C++的三个小用法&一道简单的算法题

    今天是准备春招的第一天,如果作业不多,也没什么其他事儿,就会来更新,希望自己能坚持下去。 今天翻了一下剑指offer的第一小节和一道最简单的算法题(刚开始准备嘛),记录一下。 剑指offer——C++的一些不引人注目的小点 1.C++中有哪四种与类型转换相关的关键字呢? static_cast 强制转换 const_cast 去掉const/volatile属性 reinterpret_ca...

  • 面试题2

    http://blog.csdn.net/Hackbuteer1 2011.10.17百度 面试题 1、进程切换需要注意哪些问题? 保存处理器PC寄存器的值到被中止进程的私有堆栈; 保存处理器PSW寄存器的值到被中止进程的私有堆栈; 保存处理器SP寄存器的值到被中止进程的进程控制块; 保存处理器其他寄存器的值到被中止进程的私有堆栈; 自待运行进程的进程控制块取SP值并存入处理器的寄存器SP;...

  • 软件岗位常见面试题分析

    1. 比较值传递和引用传递的相同点和不同点。 值传递是发生在函数调用过程中,将实参传递给形参过程,完成的是一个赋值操作的过程,完成以后,形参值发生变化后不影响实参;而引用,是实参取得一个别名,操作引用和操作实参没有区别 2 什么叫内联函数?它有哪些特点? 内连函数是用inline关键字标识的一类函数,在调用处编译器直接用函数体来替换,节省参数传递,控制转移等开销;内连函数不内部不能使用循环或...

  • C++标准转换运算符static_cast

    虽然const_cast是用来去除变量的const限定,但是static_cast却不是用来去除变量的static引用。其实这是很容易理解的,static决定的是一个变量的作用域和生命周期, 比如:在一个文件中将变量定义为static,则说明这个变量只能在本Package中使用; 在方法中定义一个static变量,该变量在程序开始存在直到程序结束; 类中定义一个static成员,该成员随类的...

  • C/C++ 复习

    本文总结一下C++面试时常遇到的问题。C++面试中,主要涉及的考点有 关键字极其用法,常考的关键字有const, sizeof, typedef, inline, static, extern, new, delete等等 语法问题 类型转换 指针以及指针和引用的区别 面向对象的相关问题,如虚函数机制等 泛型编程的相关问题,如模板和函数的区别等 内存管理,如字节对齐(内存对齐)、动态内存管理...

  • <> 术语表 (总) (待补充)

    术语表 目录 第 1 章 开始 第 I 部分 C++基础 第 2 章 变量和基本类型 第 3 章 字符串, 向量和数组 第 4 章 表达式 第 5 章 语句 第 6 章 函数 第 7 章 类 第 II 部分 C++标准库 第 8 章 IO库 第 9 章 顺序容器 第 10 章 泛型算法 第 11 章 关联容器 第 12 章 动态内存 第 III 部分 类设计者的工具 第 13 章 拷贝控制 ...

  • C++中表达式

    sizeof: sizeof操作符的作用是返回一个对象或类型名的长度,返回值的类型为size_t.单位为字节。 1.对char类型或值为char类型的表达式做sizeof操作保证得1. 2.对引用类型做sizeof操作将返回存放此引用类型对象所需的内存空间大小。 3.对指针做sizeof操作将返回存放指针所需的内存大小;注意如果要获取该指针所指向对象的大小,则必须对该指针进行解引用。 4.对...

  • reinterpret_cast、dynamic_cast、static_cast的使用及注意事项

    reinterpret_cast、dynamic_cast、static_cast的使用及注意事项 标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。 在C++中,使用数据类型转换时,该怎样选用合适的数据类型转换方式呢? 下面分别对这几种转换方法的使用场景做一个说明: 1. static_cast 使用方...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。