C++ casts那些事儿

简介:

C++ casts那些事儿

 

C/C++编译器类型隐式转换我想大家都一定很熟悉了。写C++的程序,要么是依靠编译器进行类型隐式转换,要么自己显示将类型进行转换,但是很少用到cast。最近看到一些代码经常使用cast来进行显示转换。自己研究下,发现cast这东西还是很有意思。

 

C++中cast关键字有:static_cast, dynamic_cast, const_cast, reinterpret_cast四种

cast的语法:

 

cast-name<type>(expressiong)

后面的expression不管是一个变量还是一个表达式,都需要使用括号。

 

const_cast:

将const变量转换成非const变量

 

#include <iostream> using namespace std; void func(char *str){ /... } int main(){ const char *mystr = "hello tan haiyan"; func(mystr); }

 

上面这段代码肯定会编译报错。无法将const char * 转换成char *

这个时候const_cast就可以起到作用了:

作出以下更改之后,就没问题了。

#include <iostream> using namespace std; void func(char *str){ /... } int main(){ const char *mystr = "hello tan haiyan"; func(const_cast<char *>(mystr)); }

 

 

只有const_cast才具有将const转换成非const类型

 

 

static_cast:

显示类型转换。这种cast的主要目的是让程序员和编译器知道这段代码作出的转换就是我想要的结果而不是失误或者偶然,这样可以去掉编译器误认为是因为程序员操作失误而产生的类型转换的警告。

 

double d_data = 3.14; int i_data = static_cast<int>(d_data);//这样显示转换,编译器不会有警告

 

 

double d_data = 3.14 void *ptr = &d_data /** 如果我们已经知道void 指针指向的是一个double数据。我们就可以作出这种强制转换*/ double *ptmp_data = static_const<double *>(ptr);

 

 

reinterpreter_cast:

reinterpreter_cast比较不好理解。它只进行一种简单的bit位复制而不进行二进制数据分析。

这种盲目的复制而不进行数据分析的强制转换在使用过程中一定要谨慎。

 

 

/** 仅仅是简单的复制了n的bit位到变量d,不进行任何数据分析 */ int n=9;    double d=reinterpret_cast<double & > (n);

 

 

dynamic_cast:

除了转换之外,多了一步安全检查,检查转换是否可行。依赖于RTTI

 

struct A { virtual void f() { } }; struct B : public A { }; struct C { }; void f () { A a; B b; A* ap = &b; B* b1 = dynamic_cast<B*> (&a); // NULL, because 'a' is not a 'B' B* b2 = dynamic_cast<B*> (ap); // 'b' C* c = dynamic_cast<C*> (ap); // NULL. A& ar = dynamic_cast<A&> (*ap); // Ok. B& br = dynamic_cast<B&> (*ap); // Ok. C& cr = dynamic_cast<C&> (*ap); // std::bad_cast }

 

 

 

 


版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/12/30/6108417.aspx
并请联系谭海燕 本人或者前往谭海燕个人主页 留言

目录
相关文章
|
机器学习/深度学习 并行计算 编译器
了解NVIDAI显卡驱动(包括:CUDA、CUDA Driver、CUDA Toolkit、CUDNN、NCVV)
开发过程中需要用到GPU时,通常在安装配置GPU的环境过程中遇到问题;CUDA Toolkit和CUDNN版本的对应关系;CUDA和电脑显卡驱动的版本的对应关系;CUDA Toolkit、CUDNN、NCVV是什么呢?
15845 1
了解NVIDAI显卡驱动(包括:CUDA、CUDA Driver、CUDA Toolkit、CUDNN、NCVV)
|
SQL 关系型数据库 数据库
C/S系统快速开发框架(C#+Winform+SQL)
开发框架集成大量的通用开发包与工具实用类,提供丰富的例子,借助技术文档、网站资源、演示源码以及在线技术指导,用户能快速投入研发自己的项目, 适用开发:制造、服务、零售、商贸等行业的ERP、MRP、MES、CRM、MIS、HIS、POS数据管理应用系统。
8182 0
|
11月前
|
开发工具 git
git大小写规则造成的问题
git大小写规则造成的问题
git大小写规则造成的问题
|
机器学习/深度学习 人工智能 自然语言处理
通义千问开源模型——改变自然语言处理的未来
众所周知,自然语言处理是人工智能领域的一个重要分支,也是近年来备受瞩目的领域之一。而通义千问开源模型作为自然语言处理领域的重要成就之一,近年来也引起了广泛的关注和讨论,那么接下来就来简单聊聊通义千问开源模型。
1275 0
通义千问开源模型——改变自然语言处理的未来
|
存储 算法 安全
CISP 考试教材《第 7 章 知识域:信息安全支撑技术》知识整理
CISP 考试教材《第 7 章 知识域:信息安全支撑技术》知识整理
198 0
|
Ubuntu Linux
Ubuntu 16.04系统开机紫屏的解决办法
具体症状为卡在开机界面,按任何键都无反应。 网上查看了几篇文章 ,如下:解决:ubuntu16.04启动时长时间停留在紫屏或跳文本的黑屏界面 Ubuntu16.04显卡驱动 电源管理 里面提到的开机进grub在Splah后加 nomodeset,我试了下没用。
7958 0
|
自然语言处理 开发者
天猫精灵技能测评实践
天猫精灵技能测评实践
10942 1
天猫精灵技能测评实践
|
存储 边缘计算 缓存
三大场景,对象存储OSS带你快速上云
本文介绍对象存储OSS的主要应用场景。 图片和音视频等应用的海量存储 OSS可用于图片、音视频、日志等海量文件的存储。
3332 0
三大场景,对象存储OSS带你快速上云
|
关系型数据库 云栖大会
攻略:如何快速赚取积分,Get云栖大会资料
2016杭州云栖大会资料分享获得大家的热烈欢迎。为此,组委会特别决定今年大会资料将以下载专题的方式,通过积分实现公开分享。那么如何来获取积分?我们特别整理了一份攻略。
14842 0
|
云安全 人工智能 大数据
阿里云ACP认证考试过关心得经验及考试费用详解
阿里云ACP专业认证考试值得考吗?当然值得!云吞铺子来说说ACP认证考试过关心得、经验分享、考试费用、报名考场等相关问题: ACP认证种类范围 ACP认证可以分为五个领域,即云计算、大数据、云安全、人工智能和中间件。
9642 0