C++中4种强制类型转换

news/2024/6/29 12:01:39 标签: c++, 编译器, null, struct, float, c
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">

             不过为了完成强制类型转换࿰c;C++中已经为我们提供了4中标准方法࿰c;它们是dynamic_cats, static_cast, const_cast, reinterpret_cast࿰c;用法形式为:dynamic_cast<类型说明符>(表达式)࿰c;之所以分成4类࿰c;就表示他们各自有着不同的使用环境࿰c;下面转载的文章会有详细的说明。

const_cast࿰c;字面上理解就是去const属性。
static_cast࿰c;命名上理解是静态类型转换。如int转换成char。
dynamic_cast࿰c;命名上理解是动态类型转换。如子类和父类之间的多台类型转换。
reinterpreter_cast࿰c;仅仅重新解释类型࿰c;但没有进行二进制的转换。

class="cnblogs_code">

const_cast 去掉类型的const或volatile属性。

 

static_cast

类似于C风格的强制转换。无条件转换࿰c;静态类型转换。用于: 1. 基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。(基类和子类之间的动态类型转换建议用dynamic_cast) 2. 基本数据类型转换。enum, class="tags" href="/tags/STRUCT.html" title=struct>struct, int, char, class="tags" href="/tags/FLOAT.html" title=float>float等。static_cast不能进行无关类型(如非基类和子类)指针之间的转换。 3. 把空指针转换成目标类型的空指针。 4. 把任何类型的表达式转换成void类型。 5. static_cast不能去掉类型的const、volitale属性(用const_cast)。

dynamic_cast 有条件转换࿰c;动态类型转换࿰c;运行时类型安全检查(转换失败返回NULL): 1. 安全的基类和子类之间转换。 2. 必须要有虚函数。 3. 相同基类不同子类之间的交叉转换。但结果是NULL。

 

reinterpreter_cast 仅仅重新解释类型࿰c;但没有进行二进制的转换: 1. 转换的类型必须是一个指针、引用、算术类型、函数指针或者成员指针。 2. 在比特位级别上进行转换。它可以把一个指针转换成一个整数࿰c;也可以把一个整数转换成一个指针(先把一个指针转换成一个整数࿰c;在把该整数转换成原类型的指针࿰c;还可以得到原先的指针值)。但不能将非32bit的实例转成指针。 3. 最普通的用途就是在函数指针类型之间进行转换。 4. 很难保证移植性。

总结 const属性用const_cast。 基本类型转换用static_cast。 多台类之间的类型转换用daynamic_cast。 不同类型的指针类型转换用reinterpreter_cast。

 

关于强制类型转的操作结果问题࿰c;可以简单总结为non-pointer变量࿰c;即基本类型和类类型产生临时变量。而指针变量只是class="tags" href="/tags/BianYiQi.html" title=编译器>编译器对其的解释方式不同而已࿰c;因此类型转换也是对其本身操作的࿰c;也就是改变了解释方式。另外变量的去const与加const转换也是在变量上直接操作࿰c;因为const是欺骗class="tags" href="/tags/BianYiQi.html" title=编译器>编译器的一个标志。

cle>

http://www.niftyadmin.cn/n/1535719.html

相关文章

openSUSE添加启动脚本

openSUSE启动程序的设置比较特殊&#xff0c;以openSUSE 11为例。openSUSE的启动较分散&#xff0c;主要有/etc/rc.d/boot.local、/etc/rc.d/after.local、/etc/init.d/before.local三个文件。每个文件的意义如下&#xff1a; /etc/rc.d/after.local 此文件需要手动创建。它是…

mysql select 语句常用手册

数据库作为存储数据的仓库&#xff0c;查询可以说是日常操作数据库当中占的比例是最多的&#xff0c;而select语句也可以说是最复杂的。 select 是DML语句中的一种&#xff0c;其他DML语句还包括。insert into &#xff0c;delete&#xff0c;update select 语句一般用法为: se…

成长?????

前两天一直的疑惑&#xff0c;我究竟在追求什么呢&#xff1f;&#xff1f;是平淡的生活&#xff0c;还是活的精彩&#xff1f;&#xff1f;很迷茫&#xff01;&#xff01;&#xff01;心里很空&#xff01;现在的工作是前者&#xff0c;不会精彩&#xff01;&#xff01; 不…

go 自己封的postgresql连接池操作包

测并发时由于使用db时没有lock&#xff0c;当连接数超过postgres设定的最大值时报错too many clients&#xff0c;于是问了下老师&#xff0c;老师说用连接池&#xff0c;一开始打开固定个数的db&#xff0c;每次都用这些db&#xff0c;而且每个db用的时候要加锁 于是就开始想如…

Qt Quick编程(1)

说道QML&#xff0c;不得不先说一下ECMAScript&#xff1a; ECMAScript语言的标准是由Netscape、Sun、微软、Borland等公司基于JavaScript和JScript锤炼、定义出来的。 ECMAScript可以为不同种类的宿主环境提供核心的脚本编程能力。ECMAScript仅仅是一个描述&#xff0c;定义了…

vim做一个shell编辑器插件安装

首先要安装Fritz Mehner编写的插件1: 下载vim插件$ cd /usr/src$ wget -O bash-support.zip http://www.vim.org/scripts/download_script.php?src_id9890 也可以在浏览器中拷贝上面的地址即可 2: 安装插件 普通权限即可&#xff1a;建立文件夹&#xff0c;一定要用这个名字&…

Win下实用但容易被遗忘的快捷键

CtrlShiftT 重新打开上次关闭的标签页。谷歌浏览器可记住最近关闭的 10 个标签页。 CtrlEnter 键 为您在地址栏中输入的内容添加”www.”和”.com”&#xff0c;然后打开网址 CtrlF5 或 ShiftF5 重新加载当前页&#xff0c;但忽略缓存内容 按住 Alt 键&#xff0c;然后点击链接…

[linux][nginx] 通过nginx扩展nginx-rtmp-module简单做了一个流媒体直播

做的过程出现很多问题&#xff0c;环境其实就需要nginx就可以&#xff0c;然后就是在播放的问题&#xff0c;m3u8的格式&#xff0c;mac直接访问就支持&#xff0c;苹果系统原生H5支持m3u8&#xff0c;还有就是手机直接访问也支持&#xff01;但是其他其他系统PC端不支持&#…