从今天開始,对C++经常使用技术做个总结。

參考书籍:《C++Primer》、《C++对象模型》、《设计模式》、《Windows核心编程》、《STL解密》。

1. static_cast等四个cast的详细意义

C++类型转换:隐式转换和显式转换。

显式转换:static_cast、dynamic_cast、reinterpret_cast、const_cast。

1.1. static_cast

使用方法:static_cast<type-id>(expression)

说明:该运算符把expression转换为type-id类型,但没有执行时类型检查来保证转换的安全性。

来源:为什么须要static_cast类型强制转换?

(1)void指针->其它类型指针。

(2)改变通常的标准转换。

(3)避免出现可能多种转换的歧义。

几种使用方法:

(1)类层次中基类和子类之间指针或引用的转换。

进行上行转换(把子类的指针或引用转换成基类)是安全的。

进行下行转换(把基类的指针或引用转换成子类)时,因为没有动态类型检查,所以是不安全的。

(2)用于基本数据类型之间的转换,如把int转换成char等。

这样的转换的安全性也要开发者来保证。

(3)把void指针转换成目标类型的指针(不安全)。

(4)把不论什么类型的表达式转换成void类型。

1.2. dynamic_cast

使用方法:dynamic_cast<type-id>(expression)

说明:该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、引用或void*。

将基类类型的指针或引用安全地转换为派生类型的指针或引用。

一次运行两个操作。它首先验证被请求的转换是否有效,仅仅有转换有效,操作符才实际进行转换。

流程图。

来源:为什么须要dynamic_cast?

简单来说,当无法使用virtual函数的时候。不能改动源代码时,才这么干。

在类层次间进行上行转换时,dynamic_cast、static_cast的效果是一样的,在进行下行转换时,dynamic_cast是具有类型检查的功能。

1.3. reinterpret_cast

使用方法:reinterpret_cast<type-id>(expression)

说明:type-id必须是一个指针、引用、算术类型、函数指针或成员指针。

使用方法:它能够把一个指针转换成一个整数,或进行相反操作。

1.4. const_cast

使用方法:const_cast<type-id>(expression)

说明:该运算符用来改动类型的const或volatile属性。

常量指针或引用被转化成很量指针或引用,而且仍然指向原对象。

常量对象被转换成很量对象。

个人理解:个人不经常使用,这个使用方法违反了设计原意。

演示样例:

class B {public: int m_iNum;};
void foo(){
const B b1;
b1.m_iNum = 1000;//编译失败,由于b1是常量
B& b2=const_cast<B&>(b1);
b2.m_iNum=200;//fine,b1、b2的m_iNum值都为200
}

C++技术问题总结-第0篇 类型转换的更多相关文章

  1. 【Unity3D技术文档翻译】第1.0篇 AssetBundles

    前言 "Unity圣典"是目前对官方文档翻译比较详细的,然而文档的最新更新日期是2013年,已经远远落后最新版本,参考意义有限.官方文档.脚本手册是学习Unity3D最直接有效的途 ...

  2. JBOSS集群技术升级版解决方案分享(图示篇)

    JBOSS集群技术升级版解决方案分享(实现篇)           前段时间,由于阿堂一直较忙,没有写点什么了,有空时一直在关注"web架构和性能,高并发,Cache层"技术领域的 ...

  3. JAVA技术专题综述之线程篇(1)

    本文详细介绍JAVA技术专题综述之线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield( ...

  4. 使用多种客户端消费WCF RestFul服务(二)——.net4.0篇

    .net 4.0篇 在.net 4.0下面微软并没有提供类似Net.Http的Rest访问组件,而是在codeplex上面提供的WCF REST Starter Kit Preview 2 里面可以找 ...

  5. [转]有哪些值得关注的技术博客(Java篇)

    有哪些值得关注的技术博客(Java篇)   大部分程序员在自学的道路上不知道走了多少坑,这个视频那个网站搞得自己晕头转向.对我个人来说我平常在学习的过程中喜欢看一些教程式的博客.这些博客的特点: 1. ...

  6. 服务端技术进阶(八)GitHub入门篇

    服务端技术进阶(八)GitHub入门篇 前言 在投递简历的过程中,发现有的公司会要求填写自己的GitHub地址,而自己却还没有GitHub帐号,准确点说是自己还不太会使用GitHub.(貌似开源社区中 ...

  7. 【web渗透技术】渗透攻防Web篇-SQL注入攻击初级

    [web渗透技术]渗透攻防Web篇-SQL注入攻击初级 前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的S ...

  8. LTE时代的定位技术:OTDOA,LPP,SUPL2.0

    LTE时代的定位技术:OTDOA,LPP,SUPL2.0 移动定位技术的发展历程 如今智能手机已经在整个社会普及,数量众多的手机应用成为了人们生活当中不可或缺的一部分.越来越多的手机应用都用到了手机定 ...

  9. Python 全栈开发【第0篇】:目录

    Python 全栈开发[第0篇]:目录   第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基 ...

随机推荐

  1. POJ 1862 Stripies 贪心+优先队列

    http://poj.org/problem?id=1862 题目大意: 有一种生物能两两合并,合并之前的重量分别为m1和m2,合并之后变为2*sqrt(m1*m2),现在给定n个这样的生物,求合并成 ...

  2. 微服务实战(二):使用API Gateway - DockOne.io

    原文:微服务实战(二):使用API Gateway - DockOne.io [编者的话]本系列的第一篇介绍了微服务架构模式.它讨论了采用微服务的优点和缺点,除了一些复杂的微服务,这种模式还是复杂应用 ...

  3. 一起talk C栗子吧(第八回:C语言实例--素数)

    各位看官们,大家好,从今天開始.我们讲大型章回体科技小说 :C栗子,也就是C语言实例. 闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们.上一回中咱们说的是进制转换的样例,这一回咱们说的 ...

  4. 基于bootstrap的漂亮网站后台管理界面框架汇总

    基于bootstrap的漂亮网站后台管理界面框架汇总 10个最新的 Bootstrap 3 管理模板 这里分享的 10 个模板是从最新的 Bootstrap 3 管理模板集合中挑选出来的,可以帮助你用 ...

  5. 从零开始使用git第一篇:下载安装配置

    从零开始使用git 第一篇:下载安装配置 第一篇:从零开始使用git第一篇:下载安装配置 第二篇:从零开始使用git第二篇:git实践操作 第三篇:从零开始使用git第三篇:git撤销操作.分支操作和 ...

  6. GCD下载后清除缓存

    //GCD下载后清除缓存1 —(void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; //清除缓存 [self.cache re ...

  7. UIActionSheet用法

    //上拉菜单 1 UIActionSheet* sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonT ...

  8. 结合Wireshark捕获分组深入理解TCP/IP协议栈之DNS协议

    摘要:     本文简单介绍了DNS协议理论知识,给出URL解析步骤,详细讲述了DNS报文各个字段含义,并从Wireshark俘获分组中选取DNS相关报文进行分析. 一.概述 1.1 DNS      ...

  9. stm32四种输入

    1.          上拉输入(GPIO_Mode_IPU)   上拉输入就是信号进入芯片后加了一个上拉电阻,再经过施密特触发器转换成0.1信号,读取此时的引脚电平为高电平:   2.       ...

  10. ZOJ List the Books 水~

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1727 题目大意: 给你书名.出版时间.价格,让你按照一定的顺序排序.. 其中题 ...