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

并请联系谭海燕
本人或者前往谭海燕个人主页
留言

时间: 2024-08-30 20:46:13

C++ casts那些事儿的相关文章

手机QQ浏览器HD项目组的那些折腾事儿

--QQ浏览器HD (iPad)的产品经理沃克 周六的夜晚,办公室里依然灯火通明,我们项目组的很多同事还在加班赶版本.这应该是项目组第N+1次周末加班了. 当我回到家的时候,已经很夜深人静了.坐下来,打开iPad,体验今晚刚Build出来的新版, 我猛然回想起来QQ浏览器HD(iPad)从1.0版本开发至今差不多一年了,回想一下,就记得我和我的伙伴们为了这个产品的一直在不断折腾. 标签栏的折腾事儿: 从1.0版开始QQ浏览器HD的我们的多标签设计,就受到用户欢迎.但是如何让标签管理更贴心,整个项

WPS文字教程:文档分分合合那些事儿

工作中经常遇到多个材料合到一起,还有时候需要把一个文档中某几页另存为一个文件,复制保存虽然可以完成,但是复杂,下面两个技巧可以帮你轻松解决"文档分分合合那些事儿". 一."多合一"文档 有很多的文档需要整合到一个文档时,使用WPS的插入文件功能,可以批量处理. 1.单击"插入|文件"菜单,打开插入文件对话框; 2.选择要合并的文件(可以配合CTRL.SHIFT键,选择多个文档); 3.单击"打开"按钮,选中的文件就合并到一个文

内行看门道!聊聊交互原则那些事儿

  刚学习交互设计的新人,面对繁多的交互设计原则,肯定晕头转向.总不能每款产品都按着交互原则一一比对吧?今天资深交互设计师老D由浅及深,聊聊交互原则的那些事儿,特别适合新人呦. 为什么需要设计原则? 设计原则其实就是对一些设计过程中基于人类的认知规律对设计做出的一些指导性原则,并且对已经成为行业共识的设计经验做个总结,用来指导设计师界定问题.提高效率. 经常用的设计原则有哪些? 先来抛一个老D在早年刚接触交互设计的时候最为大家所认可的几条设计原则: 1. 可学习性 目标用户在已有的知识和经验基础

恢复网站降权妙招三两事儿

在给大家介绍妙招之前,我觉得有必要的先给大家伙儿看上一组数据,只有这样才能让大家更加直观的明白接下来我所要讲的事儿. 首先请大家看下,这是我的一个网站近半个多月的百度收录情况,大体上看来收录还是比较不错的,一直在稳步的提升过程中,而站内我也基本坚持稳定的一天几篇原创,所以说在收录方面还是十分可观的. 不过令人十分可惜的事情是,现在网站的排名完全没有,如上图. 不难看出,我所选择的关键词都不是什么热门关键词,有些甚至是连指数都没有的词语,但即便是这样的情况,在9月10日那天一夜之间我的网站关键词,

社区口碑营销,没其他社区什么事儿!

第二届互联网社区大会召开,将口碑营销搬出来说事,似乎口碑营销能够挽救社区,且不说靠不靠谱! 1.口碑宣传的威力在是毋庸置疑的,宝洁公司旗下就有个专门运作口碑营销的公司Tremor在为包括其母公司在内的很多公司服务: 2.社区网站的互动性代表网络媒体成为口碑营销的有力工具,所以说社区存在很大的商业价值,很大程度上应该说所有网络媒体都具备这个价值,不要局限在社区: 3.比较赞同苏同:口碑营销不是在论坛.博客里灌灌水的发言,口碑营销是个比较复杂的营销行为,社区扮演其中一个角色,而不是全部: 4.同在社

从京东商城换域名说说跳转那些事儿

京东商城,360buy域名换成了jd,相信很多人都知道了吧,当发布这个消息的时候,京东声称说,为了减少对于搜索的依赖,个人觉得是为了撇清和360系列的任何关系,记得有这样一个笑话,说,360buy是不是360旗下的购物网站啊,然后很多人都跟风说,是的,说360不是安全吗,然后buy不是购买吗,于是乎成为了安全购买的一个标明词了,这次京东下定决心换掉域名,也是为了让自己的品牌走起来,脱离各种负面的影响.那么这里呢,就说说换掉域名的那些事儿吧,也是今天观察得到的一些系列. 一:百度和google的跳

站长做友情链接的那些事儿 存在哪些误区?

友情链接是网站优化的一个重要环节,对于SEO有着很大的帮助作用.很多朋友会采用各种方式与人交换友情链接,此文不讲怎么去做友情链接,也不讲做友情链接的注意事项,单单把邓肯平常做友链时遇到的一些事儿罗列出来,仅为大家参考. 事件一.被加nofollow 什么是nofollow,nofllow是个通行证,加了这个标签等于告诉搜索引擎不要追踪这个友链.这玩意儿对于接触SEO优化时间长的还好说,但新手可能会忽视掉这一很关键问题. 刚开始接触SEO的时候,没人和邓肯交换链接,好不容易等来一个,那就交换呗.隔

存储那些事儿(五) BTRFS文件系统之Btree结构详解

Btree数据结构可以说是BTRFS文件系统的基础.它提供了一个通用的方式去存储不同的数据类型.它仅仅存储3个数据类型:key, item和block header. btrfs_header的定义如下: struct btrfs_header { u8 csum[32]; u8 fsid[16]; __le64 blocknr; __le64 flags; u8 chunk_tree_uid[16]; __le64 generation; __le64 owner; __le32 nritem

分析模型的那些事儿:开始分析

--对分析模型的一点儿见解 当需求分析结束.需求确认完成.需求讨论告一段落的时候,我们的需求分析员拿出了厚厚的一打用例分析模型.领域设计模型,需求分析阶段结束,开始进入开发阶段.但是,这时候虽然需求分析阶段结束了,却千万不要以为需求分析就结束了,如果你还这样认为,说明你还没有摆脱瀑布式开发的思维.瀑布式开发的思维的关键点就是认为,需求分析阶段应当完成所有的需求分析和确认的工作,否认需求分析阶段以后还会变更需求.拥抱变化是现代软件开发思想的核心之一,什么敏捷开发.迭代开发.极限编程,都是围绕这个主