C++学习笔记 四种新式类型转换
static_cast ,dynamic_cast,const_cast,reinterpret_cast
static_cast
定义:通俗的说就是静态显式转换,用于基本的数据类型转换,及指针之间的转换,当需要把一个较大的算术类型赋值给较小的类型时,这个转换非常有用,任何具有明确定义的类型转换,只要不包含const,
都可以使用static_cast,格式如:static_cast<type-id>(expression),意为expression转换成type-id,但没有类型检查来保证转换的安全性
使用:(1) 用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类是表示)是安全的;子类的对象一般比基类大
这就是为什么基类指针可以指向并创建一个子类对象,但子类指针不能指向基类对象,即是因为上行转换是安全的,下行转换有风险
(2) 进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的
(3) 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum等等,这种转换的安全性由开发人员来保证
(4) 把void指针转换成目标类型的指针(不安全!),因为已经分配了内存,在更换目标类型的时候可能因为内存导致程序崩溃
(5) 把任何类型的表达式转换成void类型
注意:static_cast不能转换掉expression的const,volitale,或者__unaligned属性
例如:int i = 0x7fff;long l;float f;
l = static_cast<long>(i);
i = static_cast<int>(l);
//以及把子类指针转换成基类指针等
dynamic_cast
定义:是用来执行继承体系中“安全的向下转型或跨系转型动作”,使用格式同static_cast,在进行下行转换时可以得知转型是否成功,如果转失败的是指针,那么会以一个null指针形式表现出来,如果是引用
那么会以一个expression表现出来
dynamic_cast与static_cast区别:static_cast全部用于明确定义的变换,包括编译器允许我们所做的不用强制转换的安全变换和不太安全但清楚定义的变换,
在进行类型间上行转换时,其和static_cast的效果是一样的,在进行下行转换时比static_cast更安全
例子:
class B {
public:
int m_iNum;
virtual void foo();
};
class D:public B {
public:
char *m_szName[100];
}
void func(B *pb) {
D *pd1 = static_cast(pb);
D *pd2 = dynamic_cast(pb);
}
在上面的代码中,如果pb指向一个D类型的对象,pd1和pd2是一样的,并且对这两个指针执行D类型的任何操作都是安全的,因为它本身就是D类型的,所以没问题,而如果pb指向的是一个B类型的对象
那么pd1将是一个指向该对象的指针(不管是否有风险),对它进行D类型的操作将是不安全的(如访问m_szName),而pd2将是一个空指针,注意dynamic_cast转换时,B(基类)需要有虚函数,否则会编译出错
static_cast则没有这个限制,这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚表中
const_cast
定义:对“const”和“volatile”进行转换,最常见的用途就是将某个对象的常量性去掉,使用其他类型转换表达式的const属性都将引发编译器编译错误
例子:const char *pc; char *p = cosnt_cast<char *>(pc);//这种转换不能改变表达式的类型
reinterpret
转换为完全不同的意思,为了安全使用它,关键必须转换为原来的类型。转换成的类型一般只能用于位操作,否则就是为其他隐秘的目的,这是所有转换中最危险的,且跟平台有密切关系
关于作者
姓名:张坤武
邮箱:1498462303@qq.com
C++学习笔记 四种新式类型转换的更多相关文章
- C++ 四种新式类型转换
static_cast ,dynamic_cast,const_cast,reinterpret_cast static_cast 定义:通俗的说就是静态显式转换,用于基本的数据类型转换,及指针之间的 ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- WebGL three.js学习笔记 6种类型的纹理介绍及应用
WebGL three.js学习笔记 6种类型的纹理介绍及应用 本文所使用到的demo演示: 高光贴图Demo演示 反光效果Demo演示(因为是加载的模型,所以速度会慢) (一)普通纹理 计算机图形学 ...
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- MySql学习笔记四
MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...
- 官网实例详解-目录和实例简介-keras学习笔记四
官网实例详解-目录和实例简介-keras学习笔记四 2018-06-11 10:36:18 wyx100 阅读数 4193更多 分类专栏: 人工智能 python 深度学习 keras 版权声明: ...
- Dart学习笔记-运算符-条件表达式-类型转换
Dart学习笔记-运算符-条件表达式-类型转换 一.运算符 1.算术运算符 + (加)- (减)* (乘)/ (除)~/ (取整) %(取余) 2.关系运算符 == (等等) != (不等) > ...
- go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用)
目录 go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用) warden direct demo-server gr ...
- ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁
作者:Grey 原文地址: ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 当多个进 ...
随机推荐
- 网络知识学习1---(基础知识:ISO/OSI七层模型和TCP/IP四层模型)
以下的内容和之后的几篇博客只是比较初级的介绍,想要深入学习的话建议自己钻研<TCP/IP详解 卷1:协议> 1.ISO/OSI七层模型 下四层是为数据传输服务的,物理层是真正的传输数 ...
- YII的Modules模块化
转载来源: http://blog.csdn.net/mengxiangbaidu/article/details/7041296 http://blog.csdn.net/colzer/articl ...
- 中国175个 AAAAA级风景区,去过20个 以上,你就是旅游达人
省份 数量 景区名称 我 北京 7 故宫博物院 1 天坛公园 颐和园 1 八达岭-慕田峪长城旅游区 1 明十三陵景区(神路-定陵-长陵-昭陵) 恭王府景区 北京奥林匹克公园(鸟巢-水立方-中国科技馆- ...
- error C2144: 语法错误:“int”的前面应有“;”
百度网上都说是中文输入的问题. 但我的错误是函数声明时后面忘了加 :真是要死......
- 【dom4j xml】使用dom4j处理XML文件--测试过程遇到的问题
首先 关于dom4j的API,有如下: 当然 其中的实体引用有以下: 测试使用环境: 使用Maven搭建web环境,pom.xml文件配置如下: <project xmlns="ht ...
- xcode下载
http://adcdownload.apple.com/Developer_Tools/Xcode_7.3.1/Xcode_7.3.1.dmg http://adcdownload.apple.co ...
- 【DP】HDU 1087
HDU 1078 Super Jumping! Jumping! Jumping! 题意: 有这么个游戏,从start到end(自己决定在哪停下来)连续跳圈,中间不能空一个圈不跳,圈里的数字必须比你上 ...
- 【Alpha】Daily Scrum Meeting第九次
一.本次Daily Scrum Meeting主要内容 汇报情况. 上次提到的数据库字段问题,已经和合作队伍统一完毕. 在服务器上解析Json数据仍在解决中,现在直接使用手机发过去的数据进行解析. 二 ...
- JS仿淘宝星星评价
//直接复制过去就可以了(你也可以吧css和js封装成css和js文件导入). <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transit ...
- linq To DataTable
//将IEnumerable<T>类型的集合转换为DataTable类型 1111 public static DataTable LINQToDataTable<T>(IEn ...