你也许还不知道const_cast,static_cast,dynamic_cast,reinterpret_cast的区别吧?
[QQ群: 189191838,对算法和C++感兴趣可以进来]
开篇立意:
C++中各种转换令人眼花缭乱,看似差不多,实际差很多,而且在当今时间,做一个"差不多先生"其实挺难的,一不小心可能就被社会淘汰了。
数据转换(当然也包括各种对象类型的转换)是我们经常用到的,比如说一个Int转换成一个double之类的等等。如果说一个人什么样的场合穿什么样的衣服,说什么样的话是一件非常重要的事情。那么,对于什么样的数据对象用什么样的转换方式也是very important!本篇将对标题上的四种转换方式一一描述。
reinterpret_cast 直接转换
这是所有转换里面最简单粗暴的方式了,和一个男生喜欢一个女生,然后直接按倒在地差不多性质。有时候效果很好,速度很快,但是危险很高,指不定就是一个强奸罪,所以用的很少。
int *m;
char *ch=(char*)m;
char ch1=reinterpret_cast<char> (m);//和上面的效果是一样的,不进行检查,直接转换
看了上面的代码,想必大家知道了它的作用了。在实际中,除非确定可以转换成功,否则尽量别用。
static_cast
编译器中的所有隐式转换都可以用static_cast来显示的完成,一般来说只有可隐式转换时,static_cast之间的转换才是合法的。我这里说的是一般,那就还有特殊,特殊就是继承类和父类层次转换,具体稍后再说。
那么既然可以隐式转换为什么需要显示的用static_cast转换呢?当然,程序的易读性是一个考虑的因素,还有几个其他因素如下:
void指针转换成其他类型指针,这种情况不用显示转换不行吧;还有改变通常的标准转换,比如int 转换成char,或者char改成int;当然还有用于类层次结构中基类和子类之间指针或引用的转换()。进行上行转换(把子类的指针或引用转换成基类表示);进行下行转换(把基类指针或引用转换成子类指针或引用)。
class base{
public:
void print(){
cout<<"base"<<endl;
}
};
class child:public base{
public:
void print(){
cout<<"child"<<endl;
}
};
1 base *b=new base();
child *c=new child();
b=static_cast<child*>(c);//上行转换,子类指针转换成父类
b->print();
base *b=new base();
child *c=new child();
c=static_cast<child*>(b);//下行转换,父类指针转换成子类
b->print();
这里特别注意,由于下行转换没有动态类型检查,所以是不安全的。而dynamic_cast会进行检查。
dynamic_cast
dynamic_cast转换的对象必须是类的指针或者引用,和void*;
dynamic_cast是运行时是会进行类型检查的。并且这个信息存储在类的虚函数表中,只有存在虚函数的类才会虚函数表,对没有虚函数的类进行转换会导致编译错误。
还是上面那个例子:如果改成下面,在下行转换的时候因为父类没有定义虚函数,所以会编译错误。
base *b=new base();
child *c=new child();
c=dynamic_cast<child*>(b);//下行转换,父类指针转换成子类
b->print();
当然,在上行转换的时候效果和static_cast<>;是一样的。
所以dynamic_cast一般是在多态中上下行转换比较多见。如果转换到指针类型失败了,dynamic_cast的结果是0;如果是引用的时候失败了,它则会抛出一个bad_cast类型的异常。
const_cast
顾名思义,它似乎应该用于和const相关。也的确如此,他就是remove或者add表达式的const性质。
int x=;
const int *y=const_cast<int*>(&x);
下面是remove它的const性质
const int x=;
int *y=const_cast<int*>(&x);
本文把四种显示转换的用法基本都有所涉猎,希望对大家有所帮助。错误处请指正!不甚感谢!
参考文献:http://stackoverflow.com/questions/28002/regular-cast-vs-static-cast-vs-dynamic-cast
http://blog.csdn.net/bzhxuexi/article/details/17021559
转载请注明出处:http://www.cnblogs.com/xiaoyi115/p/3629696.html
你也许还不知道const_cast,static_cast,dynamic_cast,reinterpret_cast的区别吧?的更多相关文章
- c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast
c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast [版权声明]转载请注明出处 http://www.cnblogs.c ...
- C++雾中风景11:厘清C++类型转换(static_cast,dynamic_cast,reinterpret_cast,const_cast)
C++是一门弱类型的语言,提供了许多复杂和灵巧类型转换的方式.笔者之前写的Python与Go都是强类型的语言,对这种弱类型的设计实在是接受无力啊~~ ( 生活所迫,工作还得写C++啊~~)C++语言提 ...
- static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
隐式转换(implicit conversion) ; int b; b=a; short是两字节,int是四字节,由short型转成int型是宽化转换(bit位数增多),编译器没有warning,如 ...
- C++ static_cast dynamic_cast reinterpret_cast const_cast转换
static_cast <type-id> ( expression ) 和C风格的类型转换相似,可以转换一个指针到基类,或者派生类.不做Run-time类型检查,这样转换并不总是安全的. ...
- static_cast, dynamic_cast, reinterpret_cast, const_cast的区别
static_cast最像C风格的强制转换,很多时候都需要程序员自身去判断转换是否安全.但是相对C风格的强制转换,在无关类的类指针之间转换上,有安全性的提升. dynamic_cast是运行时的转换吧 ...
- Qt 中C++ static_cast 和 reinterpret_cast的区别
1.C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作.因此,被做为隐式类型转换使用.比如: int i; float f = 166.7f; i = static_cast ...
- Qt 中C++ static_cast 和 reinterpret_cast的区别(static_cast是隐式类型转换,会有数据损失,reinterpret_cast是底层二进制转换,没有数据损失)
1.C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作.因此,被做为隐式类型转换使用.比如: int i; float f = 166.7f; i = static_cast ...
- static_cast ,reinterpret_cast
用法:static_cast < type-id > ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性.它主要有 ...
- static_cast和reinterpret_cast
static_cast和reinterpret_cast 相同点:都是暴力转换,从一个类型转换为另一个类型,对于类指针不会保证安全性 static_cast和reinterpret_cast的区别 ...
随机推荐
- 01--是时候让我们谈谈一致性hash了
--------------------- 假如你有图中三个盒子,我们有代号为 1,4,5,12 这四样东西 那根据代号作为主键,将东西放到盒子了,该如何放置? 我们可以对代号取模 1 mod 3 = ...
- OZ常见错误解决办法
执行成功 错误信息解决办法 libvirt.libvirtError: Failed to connect socket to '/var/run/libvirt/libvirt-sock': No ...
- 【Linux】wc :字数统计命令
wc :(Word Count) 统计每个传入文件中行数.词数与字节数 $ wc py_this # 三个数字分别对应行数.词数和字节数 21 144 857 py_this $ wc py_this ...
- 安卓context(一)
最近看了一下深入安卓内核,毫无安卓基础的我一头深入不可自拔,看的是云里雾里,第一遍看到一半左右似乎开始失去了效率. 现在开始第二遍,并对看过的重要知识点以个人的理解进行梳理(不免有错的地方,好心人请告 ...
- Metaspolit
Metaspolit介绍 Metasploit是一款开源的安全漏洞检测工具,安全工作人员常用 Metasploit工具来检测系统的安全性.Metasploit Framework (MSF) 在200 ...
- hadoop2.5.2学习及实践笔记(四)—— namenode启动过程源码概览
对namenode启动时的相关操作及相关类有一个大体了解,后续深入研究时,再对本文进行补充 >实现类 HDFS启动脚本为$HADOOP_HOME/sbin/start-dfs.sh,查看star ...
- xpath属性值的模糊匹配
得至:http://bbs.csdn.net/topics/390857942 最后一楼 //div[contains(@class,'Number Skill')]
- SPOJ - BALNUM Balanced Numbers
题意: 求出所给范围内满足其数位上的奇数出现偶数次,数位上的偶数出现奇数次(或不出现)的数的个数. 思路: 对于0 ~ 9 每个数有3种情况. 1.没出现过 2.出现奇数次 3.出现偶数次 那么就可以 ...
- [Codeforces438E][bzoj3625] 小朋友和二叉树 [多项式求逆+多项式开根]
题面 传送门 思路 首先,我们把这个输入的点的生成函数搞出来: $C=\sum_{i=0}^{lim}s_ix^i$ 其中$lim$为集合里面出现过的最大的数,$s_i$表示大小为$i$的数是否出现过 ...
- angular组件--tips提示功能
将组件封装起来在项目中开发很实用,之前遭遇过一次痛苦的经历,那阵子改的要吐血了.常用的组件封装起来,改公共的地方,往往多处受用. 例如:我在项目中引用 tips.text('加载中...',fals ...