C++技术问题总结-第0篇 类型转换
从今天開始,对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篇 类型转换的更多相关文章
- 【Unity3D技术文档翻译】第1.0篇 AssetBundles
前言 "Unity圣典"是目前对官方文档翻译比较详细的,然而文档的最新更新日期是2013年,已经远远落后最新版本,参考意义有限.官方文档.脚本手册是学习Unity3D最直接有效的途 ...
- JBOSS集群技术升级版解决方案分享(图示篇)
JBOSS集群技术升级版解决方案分享(实现篇) 前段时间,由于阿堂一直较忙,没有写点什么了,有空时一直在关注"web架构和性能,高并发,Cache层"技术领域的 ...
- JAVA技术专题综述之线程篇(1)
本文详细介绍JAVA技术专题综述之线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield( ...
- 使用多种客户端消费WCF RestFul服务(二)——.net4.0篇
.net 4.0篇 在.net 4.0下面微软并没有提供类似Net.Http的Rest访问组件,而是在codeplex上面提供的WCF REST Starter Kit Preview 2 里面可以找 ...
- [转]有哪些值得关注的技术博客(Java篇)
有哪些值得关注的技术博客(Java篇) 大部分程序员在自学的道路上不知道走了多少坑,这个视频那个网站搞得自己晕头转向.对我个人来说我平常在学习的过程中喜欢看一些教程式的博客.这些博客的特点: 1. ...
- 服务端技术进阶(八)GitHub入门篇
服务端技术进阶(八)GitHub入门篇 前言 在投递简历的过程中,发现有的公司会要求填写自己的GitHub地址,而自己却还没有GitHub帐号,准确点说是自己还不太会使用GitHub.(貌似开源社区中 ...
- 【web渗透技术】渗透攻防Web篇-SQL注入攻击初级
[web渗透技术]渗透攻防Web篇-SQL注入攻击初级 前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的S ...
- LTE时代的定位技术:OTDOA,LPP,SUPL2.0
LTE时代的定位技术:OTDOA,LPP,SUPL2.0 移动定位技术的发展历程 如今智能手机已经在整个社会普及,数量众多的手机应用成为了人们生活当中不可或缺的一部分.越来越多的手机应用都用到了手机定 ...
- Python 全栈开发【第0篇】:目录
Python 全栈开发[第0篇]:目录 第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基 ...
随机推荐
- Linux 内核源代码分析 chap 2 存储管理 (5)
物理页面分配 linux 内核 2.4 中有 2 个版本号的物理页面分配函数 alloc_pages(). 一个在 mm/numa.c 中, 还有一个在 mm/page_alloc.c 中, 依据条件 ...
- <九度 OJ>题目1012:畅通project
题目描写叙述: 某省调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.省政府"畅通project"的目标是使全省不论什么两个城镇间都能够实现交通(但不一定 ...
- 线程TLAB区域的深入剖析
(1) 堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的 (2) Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程 ...
- php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)
php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习) 一.总结 1.递归不优化的话,30层开外就有点吃力了 2.php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是p ...
- 24、驱动调试之printk
1.uboot跳转到内核启动的时候通过环境变量 console设置控制台 (console = ttySAC0表示输出到串口,并从串口结束输入,也可以设置console=tty1,表示输出到LCD,从 ...
- CSS负边距margin的应用
原文 简书原文:https://www.jianshu.com/p/75a178e65207 相关文章 CSS负margin的影响:https://www.cnblogs.com/shcrk/p/93 ...
- windows cmd 查看文件目录树
windows + R ⇒ 输入 cmd ⇒ 进入 windows 命令行界面: tree/?:命令提示: tree:不输入任何参数,输出一棵目录树 不显示文件,只显示目录: tree/F:递归显示目 ...
- C++ 中的 const 类型变量
之前总感觉C/C++中有const 限定的变量是个很头痛的问题,一会儿能够变.一会儿不能够变,一会儿把const赋给nonconst,一会儿又把nonconst赋给const,头都被它搞大了.今天刚好 ...
- RSA解密时javax.crypto.BadPaddingException: Data must start with zero
解决方法:要在加密后产生的byte数组转成string时要在各byte之间加个标识符,我加了个空格,然后再根据空格分隔转换回byte数组.如果不加标识符,由于byte值可能是一位到三位,无法知道某一个 ...
- 基于 Android NDK 的学习之旅----- Java 方法映射到C中的签名
刚接触JNI 的 兄弟在看一些demo的时候 发现有类似与“([Ljava/lang/String;)V”的东西的时候肯定会很“蛋疼”,完全不懂这是啥东西,怎么来的,有啥用处? 今天就讲讲这个“蛋疼” ...