【Effection C++】读书笔记 条款27:尽量少做转型动作
【Effective C++】读书笔记 Part5 实现
条款27:尽量少做转型动作
C++中的类型转换语法
类型转换语法主要有三种不同的形式:
- (T)expression //将expression转型为T
- T(expression) //将expression转型为T
两种形式除了写法不同之外,没有其他差别,都是C语法中的旧式转换(old-syle casts)。
- C++提供四种信使转换(new-style 或者 C++-sytle casts)
- const_cast( expression )
- dynamic_cast( expression )
- reinterpret_cast( expression )
- static_cast( expression )
各有不同的目的。
const_cast:通常用来将对象的常量性移除,也是唯一有能力的C++-style转型操作符。将const转为non-const。
dynamic_cast:主要用来“执行安全向下转型”,它用来决定某对象是否是继承体系中的某个类型。它是唯一一个无法由旧式转型语法执行的动作,也是唯一可能耗费重大运行成本的转型动作。
static_cast:编译器隐式执行的任何类型转换都可以由static_cast。只有当编译类型之间可以进行隐式转换,或者是类层次间的下行转换,static_cast的转换才是合法的,否则就会出错。如int向double的转换,double向int的转换, *向其他类型的指针的转换。pointer-to-base向pointer-to-derived的转换。
reinterpret_cast:主要是执行低级转换,实际动作可能取决于编译器,这就表示了它不可移植。主要是提供存储内容的比特位的重新解。
- 转型总会带来一些副作用,任何一个类型转换往往都令编译器编译出一些运行期间执行的代码。
- 在多重继承的时候,derived class的指针值和相应的base class的指针值是不同的。
- dyname_cast转型的执行速度往往非常慢。主要是将exppression转换为类的指针,引用void *类型。
dynamic_cast涉及运行时类型检查,dynamic运行时候类型检查需运行时类型信息,而这个信息存放在虚函数表中,只有定义了虚函数的类才会有虚函数表,所有对没有虚函数的类使用会导致编译错误。
如果编译通过,在运行时候,dynamic_cast都先会判断类型转换是否有效(可能需要多次class名称的strcmp,速度较慢),如果类型转换无效,就会将转换后的指针置为null,或者在转换为引用的时候抛出bad_cast异常。
最后:
- 如果可以,尽量避免转型,特别是在注重效率的代码中避免dynamic_cast。
- 如果转型是必要的,试着将它隐藏在某个函数背后。客户可以直接调用该函数,而不需要将转型放进他们的代码中。
- 宁可使用C++style的新式转型,也不要使用旧式转型。前者很容易辨认出来,而且也有着比较分门别类的职责。
【Effection C++】读书笔记 条款27:尽量少做转型动作相关推荐
- Effective C++之条款27:尽量少做转型动作
声明: 文中内容收集整理自<Effective C++(中文版)第三版>,版权归原书所有. 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正. 条款27: ...
- 条款27:尽量少做转型动作
首先是C++提供的四种转型操作: 1. const_cast:常量性的转除. 2. dynamic_cast:安全的向derived class进行转型,可能会带来很高的开销 3. reinterpr ...
- 【Effection C++】读书笔记 条款01~条款04
[Effection C++]读书笔记 Part1 让自己习惯C++ 条款01:视C++为一个语言联邦 将C++视为一个由相关语言组成的联邦.在其某个次语言中,各种守则简单易懂,容易记住.但当从一个次 ...
- 【Effection C++】读书笔记 条款20~条款23
[Effective C++]Part4 设计与声明 条款20:宁以pass-by-reference-to-const替换pass-by-value 尽量以pass-by-reference-to- ...
- 【Effection C++】读书笔记 条款10~条款12
[Effection C++]读书笔记 Part2 构造/析构/赋值运算 条款09:绝不在构造和析构函数中调用virtual函数 构造函数和析构函数期间不要调用virtual函数,虽然语法上并不会有错 ...
- 【Effection C++】读书笔记 条款05~条款06
[Effection C++]读书笔记 Part2 构造/析构/赋值运算 条款05:了解C++默认编写并调用哪些函数 编译器可以暗自为class创建default构造函数,copy构造函数,copy ...
- 【Effection C++】读书笔记 条款29~条款30
[Effective C++]读书笔记 Part5 实现 条款29:为异常安全而努力是值得的 当异常被抛出时,待哟异常安全性的函数会: 不泄漏任何资源. 不允许数据败坏. 异常安全函数提供以下三个保证 ...
- 【Effection C++】读书笔记 条款41~条款42
[Effection C++]读书笔记 Part7 模板与泛型编程 条款41:了解隐式接口和编译器多态 本条款主要是讲述了两个概念,隐式接口和编译器多态 1. 显示接口和隐式接口 显示接口是由函数的签 ...
- 【Effection C++】读书笔记 条款07~条款08
[Effection C++]读书笔记 Part2 构造/析构/赋值运算 条款07:为多态基类声明virtual析构函数 带有多态(polymorphic)性质的base classes应该声明一个v ...
最新文章
- 1.Spring Security 详细简绍与入门
- 关于读取数据库进行数据处理的一些小问题
- Spring-data-redis:特性与实例--转载
- 抽象工厂类--一个简单的例子
- zip:命令行下zip压缩/解压缩
- mysql死锁查询_Mysql 查看死锁,解除死锁 方式
- 车间生产能耗管控方案_如何给生产车间降温 环保空调的这些方案一定能帮到你...
- 信息学奥赛一本通 1159:斐波那契数列
- 关于String,StringBuffer和StringBuilder之间的区别和联系
- python使用ray框架改进原有代码,实现多进程与分布式
- atitit.提升开发效率---MDA 软件开发方式的革命(4)----编辑表单建模
- 输出一行数字,中间用空格隔开,最后一个数字没有空格
- 区块链(BlockChain)基础概念
- 攻击机靶机环境搭建——网络设置
- 吐血推荐:数据库你想知道的都在这
- 教你更划算的选择苹果最新产品Mac Studio
- WPF UnhandledException
- 2015 ACM Arabella Collegiate Programming Contest(F题)
- button type属性
- java代码读取excel文件,同时兼容2003和2007
热门文章
- 三星a9s参数_三星A9s参数配置怎么样
- pip安装了 但是python找不到_解决python明明pip安装成功却找不到包的问题
- 烽火HG680-KB_Hi3798MV310_当贝桌面_强刷及免拆_两种方法-卡刷固件包
- 第二届天府大地艺术季(春)分会场暨晨光社区系列主题活动开启
- uvm_primer ch7 static方法和变量
- 电源管理芯片的更新换代和各种应战
- 虚拟磁带库(VTL)的基本知识和采购指南
- 弦截法c语言求方程XeX-1=0的解,编程用弦截法求方程 f(x)=3x^3-5x^2+16x-60=0的根
- 山东大学项目实训之安卓reportActivity上报不良事件
- Docker系列 WordPress系列 动态对话页面