C++类型转化:static_cast,reinterpret_cast,dynamic_cast,const_cast
类型转换名称和语法
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:
TYPE b = (TYPE)a
C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。
static_cast 静态类型转换。如int转换成char
reinterpreter_cast 重新解释类型
dynamic_cast 命名上理解是动态类型转换。如子类和父类之间的多态类型转换。
const_cast, 字面上理解就是去const属性。
4种类型转换的格式:
TYPE B = static_cast<TYPE> (a)
demo 1
#include <iostream> #include <cstdio> using namespace std; int main() { double pi = 3.1415926; int num1 = (int)pi; // C类型转换 int num2 = static_cast<int>(pi); // 静态类型转换,编译的时候C++编译器会做类型检查 int num3 = pi; // C语言中隐式类型转换的地方,均可使用static_cast<>()进行类型转换 char *p1 = "hello"; int *p2 = NULL; //p2 = static_cast<int *>(pi); // 使用static_cast,编译时编译器会报错 // 会做类型检查,若有错误,提示错误 p2 = reinterpret_cast<int *>(p1); // 若不同类型之间,进行强制类型转换,用reinterpret_cast<>()进行重新解释 cout << "p1: " << p1 << endl; // %s cout << "p2: " << p2 << endl; // %d /* p1: hello p2: 0127CA54 */ return 0; }
总结:
1)static_cast<>() 静态类型转换,编译的时c++编译器会做类型检查;
基本类型能转换 但是不能转换指针类型。
2)若不同类型之间,进行强制类型转换,用reinterpret_cast<>() 进行重新解释;
3)一般性结论:
C语言中 能隐式类型转换的,在c++中可用 static_cast<>()进行类型转换。因C++编译器在编译检查一般都能通过;
C语言中不能隐式类型转换的,在c++中可以用 reinterpret_cast<>() 进行强行类型。
解释。总结:static_cast<>()和reinterpret_cast<>() 基本上把C语言中的 强制类型转换给覆盖。
reinterpret_cast<>()很难保证移植性。
demo 2 - dynamic_cast<>(),动态类型转换,安全的基类和子类之间转换;运行时类型检查
#include <iostream> #include <cstdio> using namespace std; class Tree {}; class Animal { virtual void cry() = 0; }; class Dog : public Animal { public: virtual void cry() { cout << "bowwow~" << endl; } void doHome() { cout << "look after the house!" << endl; } }; class Cat : public Animal { public: virtual void cry() { cout << "meow" << endl; } void doThing() { cout << "catch a Mouse" << endl; } }; void playObj(Animal *base) { base->cry(); // 1有继承,2虚函数重载,3父类指针,指向子类对象。 // 会发生多态 // 识别子类对象 // dynamic_cast<>()运行时类型识别 Dog *pDog = dynamic_cast<Dog *>(base); if (pDog != NULL) { pDog->doHome(); } Cat *pCat = dynamic_cast<Cat *>(base); if (pCat != NULL) { pCat->doThing(); } } int main() { Dog d1; Cat c1; Animal *pBase = NULL; pBase = &d1; pBase = static_cast<Animal *>(&d1); // 让C++编译器在编译的时候进行类型检查 // 强制类型转换 pBase = reinterpret_cast<Animal *>(&d1); { Tree t1; //pBase = static_cast<Animal *>(&t1); // C++编译器做类型检查,报错 pBase = reinterpret_cast<Animal *>(&t1); // reinterpret_cast重新解释,这里有强制类型转换的感觉 } playObj(&d1); playObj(&c1); return 0; }
demo 3 - const_cast<>(),去除变量的只读属性
#include <iostream> #include <cstdio> using namespace std; // const char *p的const修饰,让p指向的内存空间变成只读属性 void printBuf(const char *p) { //p[0] = 'Z'; // 报错 char *p1 = NULL; // 程序员需要清楚的知道变量转换之前是什么类型,转换之后是什么类型 // const char * ==> char * 把只读属性去掉了 p1 = const_cast<char *>(p); p1[0] = 'Z'; // 通过p1修改了内存空间 cout << p << endl; } int main() { char buf[] = "aaaaaaaasssssssssdddddddd"; printBuf(buf); // 注意,要确保p所指向的内存空间确实能修改,如果不能修改,会带来灾难性后果 char *myp = "aaaaaadfdafaf"; // myp指向一块常量空间,这里是无论如何都不能被修改的 //printBuf(myp); // 运行直接奔溃 return 0; }
总结
结论1:程序员要清除的知道: 要转的变量,类型转换前是什么类型,类型转换后是什么类型。转换后有什么后果。
结论2:一般情况下,不建议进行类型转换;避免进行类型转换。
C++类型转化:static_cast,reinterpret_cast,dynamic_cast,const_cast的更多相关文章
- static_cast, dynamic_cast, const_cast 三种类型转化的区别
强制转化四种类型可能很多人都常常忽略就象我一样,但是有时还是比较有用的.不了解的建议看看,一些机制我也不是十分了解,只是将一些用法写出来让大家看看. ...
- C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast
1. c强制转换与c++强制转换 c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换格式1 type-id(expression)//转换格式2 ...
- C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast
在C++中,存在类型转换,通常意味着存在缺陷(并非绝对).所以,对于类型转换,有如下几个原则:(1)尽量避免类型转换,包括隐式的类型转换(2)如果需要类型转换,尽量使用显式的类型转换,在编译期间转换( ...
- static_cast、dynamic_cast、reinterpret_cast、和const_cast
关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的<C++ 的设计和演化>.最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_ ...
- C++ ------ static_cast,dynamic_cast,reinterpret_cast,const_cast
C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式 ...
- C++里的强制类型转换符reinterpret_cast、static_cast 、dynamic_cast、const_cast 区别
C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的 ...
- C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast(dynamic_cast还支持交叉转换,const_cast将一个类的const、volatile以及__unaligned属性去掉)
在C++中,存在类型转换,通常意味着存在缺陷(并非绝对).所以,对于类型转换,有如下几个原则:(1)尽量避免类型转换,包括隐式的类型转换(2)如果需要类型转换,尽量使用显式的类型转换,在编译期间转换( ...
- static_cast、dynamic_cast、reinterpret_cast、const_cast以及C强制类型转换的区别
static_cast 1. 基础类型之间互转.如:float转成int.int转成unsigned int等 2. 指针与void*之间互转.如:float*转成void*.CBase*转成void ...
- static_cast dynamic_cast const_cast reinterpret_cast总结对比
[本文链接] http://www.cnblogs.com/hellogiser/p/static_cast-dynamic_cast-const_cast-reinterpret_cast.html ...
随机推荐
- “你什么意思”之基于RNN的语义槽填充(Pytorch实现)
1. 概况 1.1 任务 口语理解(Spoken Language Understanding, SLU)作为语音识别与自然语言处理之间的一个新兴领域,其目的是为了让计算机从用户的讲话中理解他们的意图 ...
- 国内外主流BI工具介绍和点评
商业智能的应用在国外已广为普及,并且开始不断探索大数据和云技术.而国内,商业智能BI工具在这几年才开始慢慢被接受,企业开始有意识地建立一体化数据分析平台,为经营决策提供分析. 从国内企业使用情况来看, ...
- hive 压缩全解读(hive表存储格式以及外部表直接加载压缩格式数据);HADOOP存储数据压缩方案对比(LZO,gz,ORC)
数据做压缩和解压缩会增加CPU的开销,但可以最大程度的减少文件所需的磁盘空间和网络I/O的开销,所以最好对那些I/O密集型的作业使用数据压缩,cpu密集型,使用压缩反而会降低性能. 而hive中间结果 ...
- ERROR: In <declare-styleable> MenuView, unable to find attribute android:preserveIconSpacing
eclipse sdk从低版本切换到高版本sdk的时候 v7包会包这个错ERROR: In <declare-styleable> MenuView, unable to find ...
- 非阻塞IO服务器模型
我们来考虑一个情形,你跟千千万万个玩家是魔兽世界的超级粉丝,每周末准时组团打boss.每当周末游戏服务器就亚历山大,因为起码几十万用户同时在线.如果用我们的多线程阻塞服务器作为游戏服务器是否可行呢?先 ...
- Linux Java开发坏境搭建,Ubuntu-jdk+tomcat+eclipse+svn 包安装详细操作
更新时间2015-03-15 更新2015-04-12 svn安装更新 第一步 安装jdk (在linux上使用yum安装JDK http://blog.chinaunix.net/uid-1546 ...
- redhat7 上安装dummynet
更多请访问 http://www.webpersonaldeveloper.cn 摘要: 在redhat 上部署dummynet 需要将ipfw 编译为内核模块,而ipfw需要调用linux kern ...
- Windows上C语言实现设置控制台的颜色
这里设置只要调用system();这个函数就行了,参数是字符串,想要设置终端的颜色,按照以下格式可以设置: //数字表示前景色,字母表示背景色 //color 0=黑色 1蓝色 2 绿色 3湖蓝色 4 ...
- SYBASE bcp用法及例子
BCP是SYBASE公司提供专门用于数据库表一级数据备份的工具. 语法: 语法如下:(可用 bcp – 得到) 常用参数说明: -b batch_size 指定所复制的每批数据中的行数.每个批处理作为 ...
- ExtJS学习(三)Grid表格
表格说明 Ext中的表格功能非常强大,包括排序.缓存.拖动.隐藏某一列.自动显示行号.列汇总.单元格编辑等实用功能.表格由类Ext.grid.GridPanel定义,继承自Ext.Panel,其xty ...