- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[深入理解C〔一〕]类型转换〔TypeCasting〕
[深入理解C++(一)]类型转换(Type Casting)
分类: C/C++ 2012-10-28 21:30394人阅读评论(2)收藏举报
[深入理解C++(一)]类型转换(Type Casting)
罗朝辉 (/kesalin)
CC许可,转载请注明出处
类型转换就是将给定类型的表达式转换为另一种类型。C++中的转型可分为两种:隐式类型转换和显式类型转换。下面将一一介绍。
一,隐式类型转换
隐式类型转换是C中的遗留物,在C++中并不推荐使用(C++有专门的转型操作符,见下文的显式转型)。将某种类型的对象拷贝到另一种不同类型的对象中时就会发生隐式转型。比如异型赋值,返回值(函数声明的返回值与代码块实际返回值不同的情况下),按值传递异型参数等情况均会发生隐式类型转换。
short a = 128;
int b;
b = a;
如上所示,short 类型的对象被赋值给 int 型的对象,这是C++语言内建支持的标准转换。
情形一:标准转换支持数值类型,bool以及某些指针之间相互转换。注意:某些转换可能会导致精度丢失,比如从 long 转换到 int。
情形二:可被单参调用(只有一个参数或多个参数但至少从第二个参数起均带有缺省值)的构造函数或隐式类型转换操作符也会引起隐式类型转换。比如:
class A {};
class B
{
public: B (A a) {}
public: B (int c, int d = 0);
public: operator double() const;
};
A a;
B b1 = a;
B b2 = 10;
B b3;
double d;
d = 10 + b3;
上面的代码里就存在只带有一个参数的构造函数,多个参数但至少从第二个参数起均带有缺省值以及用户自定义类型转换操作符这三种情况。
隐式类型转换是件麻烦事,它们很可能导致错误或非预期的函数被调用(参看ME 条款5);此外 C++ 也不能在一个转换过程中连续进行多余一次的用户自定义转换操作(即情形二中的转换),如下所示:接上面的代码,A (类型的对象,后略)可被隐式转换为 B,B 可被隐式转换为 C,但 A 却非常不合逻辑地不可被隐式转换为 C。
class C
{
public: C(B b) {};
}
A a;
C c;
C = a; // 错误!
因此应该尽量避免隐式类型转换,为此 C++ 提供了关键字 explicit 来规避可被单参调用的构造函数引起的隐式类型转换。但标准转换以及隐式类型转换操作符引起的转换只能交由那些追求至善至美的程序员来小心处理了。当然 C++ 语言还是提供了必要的工具来辅助那些追求至善至美的程序员,这些工具就是下面要讲的显式类型转换关键字:static_cast, const_cast, dynamic_cast 以及 reinterpret_cast。
二,显式类型转换
C++ 是一门强类型转换,因此不同自定义类型之间的转换必须进行显式转换,当然基础数据类型也可以进行显式转换。
short a = 10;
int b;
b = (int) a; // c-like cast notation
b = int (a); // functional notation
以上是基础数据类型之间进行传统的强制类型转换。这种强制类型转换可以在两种指向不同类型对象的指针之间进行,这很可能是相当危险的事情。所以 C++ 提供四种转换操作符来细分显式类型转换:
static_cast new_type (expression)const_cast new_type (expression)dynamic_cast new_type (expression)reinterpret_cast new_type (expression)
static_cast
static_cast 很像 C 语言中的旧式类型转换。它能进行基础类型之间的转换,也能将带有可被单参调用的构造函数或用户自定义类型转换操作符的类型转换,还能在存有继承关系的类之间进行转换(即可将基类转换为子类,也可将子类转换为基类),还能将 non-const对象转换为 const对象(注意:反之则不行,那是const_cast的职责。)。
double d = 3int i = static_castint(d);
classA {};class B
{public:
B (A a) {};};
A a;B b =static_castB(a);
class CBase {};
class CDerived: public CBase {};
CB
您可能关注的文档
- PS的基本功能和技巧〔修正〕.doc
- PWM控制电路基本原理和FPGA.doc
- PVC电缆料的配方和工艺流程.docx
- Proe第1课平面图的绘制.doc
- QCIFCIF4CIFD1720P1080I1080P分辩率、清晰度及其应用〕〔收集整理.doc
- QJ系列深井泵常见故障和排除方法.doc
- PU膜〔与TPU的比较〕.doc
- QQ个性签名大全〔五〕最牛.doc
- QQ个性签名大全〔六〕签名符号.doc
- QQ个性签名︰总是羡慕别人恩爱,才发现自己的心是空的.doc
- 2024年江西省寻乌县九上数学开学复习检测模拟试题【含答案】.doc
- 2024年江西省省宜春市袁州区数学九上开学学业水平测试模拟试题【含答案】.doc
- 《GB/T 44275.2-2024工业自动化系统与集成 开放技术字典及其在主数据中的应用 第2部分:术语》.pdf
- 中国国家标准 GB/T 44275.2-2024工业自动化系统与集成 开放技术字典及其在主数据中的应用 第2部分:术语.pdf
- GB/T 44285.1-2024卡及身份识别安全设备 通过移动设备进行身份管理的构件 第1部分:移动电子身份系统的通用系统架构.pdf
- 《GB/T 44285.1-2024卡及身份识别安全设备 通过移动设备进行身份管理的构件 第1部分:移动电子身份系统的通用系统架构》.pdf
- 中国国家标准 GB/T 44285.1-2024卡及身份识别安全设备 通过移动设备进行身份管理的构件 第1部分:移动电子身份系统的通用系统架构.pdf
- GB/T 44275.11-2024工业自动化系统与集成 开放技术字典及其在主数据中的应用 第11部分:术语制定指南.pdf
- 中国国家标准 GB/T 44275.11-2024工业自动化系统与集成 开放技术字典及其在主数据中的应用 第11部分:术语制定指南.pdf
- 《GB/T 44275.11-2024工业自动化系统与集成 开放技术字典及其在主数据中的应用 第11部分:术语制定指南》.pdf
最近下载
- 小学一年级家长会语文老师PPT课件1_图文.ppt
- 奥鹏云南开放大学 小学语文案例教学(20秋)形考作业4(客观).doc VIP
- 沅陵大曲酒厂续建项目(重大变更) 环境影响报告书.pdf
- SH∕T 1541.1-2019 塑料颗粒外观试验方法 第1部分:目测法.pdf
- 泳池清洁机器人.pdf VIP
- 中职高考语文二轮复习写作技巧专项突破专题01 应用文写作-技巧与练习(含详解).docx VIP
- (人教版)数学三年级上册计算题“天天练”习题卡,含100份题组,附参考答案.doc
- 【新教材】人教PEP版(2024)三年级上册英语Unit 1 Making friends单元整体教学设计.docx
- 乡村学校德育工作实践.docx VIP
- “国家中小学智慧教育平台”培训方案(2).doc
文档评论(0)