【Effective C++】读书笔记 Part5 实现

条款27:尽量少做转型动作

C++中的类型转换语法

类型转换语法主要有三种不同的形式:

  1. (T)expression //将expression转型为T
  2. T(expression) //将expression转型为T

两种形式除了写法不同之外,没有其他差别,都是C语法中的旧式转换(old-syle casts)。

  1. C++提供四种信使转换(new-style 或者 C++-sytle casts)

    1. const_cast( expression )
    2. dynamic_cast( expression )
    3. reinterpret_cast( expression )
    4. 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:主要是执行低级转换,实际动作可能取决于编译器,这就表示了它不可移植。主要是提供存储内容的比特位的重新解。

  1. 转型总会带来一些副作用,任何一个类型转换往往都令编译器编译出一些运行期间执行的代码。
  2. 在多重继承的时候,derived class的指针值和相应的base class的指针值是不同的。
  3. dyname_cast转型的执行速度往往非常慢。主要是将exppression转换为类的指针,引用void *类型。

dynamic_cast涉及运行时类型检查,dynamic运行时候类型检查需运行时类型信息,而这个信息存放在虚函数表中,只有定义了虚函数的类才会有虚函数表,所有对没有虚函数的类使用会导致编译错误。

如果编译通过,在运行时候,dynamic_cast都先会判断类型转换是否有效(可能需要多次class名称的strcmp,速度较慢),如果类型转换无效,就会将转换后的指针置为null,或者在转换为引用的时候抛出bad_cast异常。

最后:

  1. 如果可以,尽量避免转型,特别是在注重效率的代码中避免dynamic_cast。
  2. 如果转型是必要的,试着将它隐藏在某个函数背后。客户可以直接调用该函数,而不需要将转型放进他们的代码中。
  3. 宁可使用C++style的新式转型,也不要使用旧式转型。前者很容易辨认出来,而且也有着比较分门别类的职责。

【Effection C++】读书笔记 条款27:尽量少做转型动作相关推荐

  1. Effective C++之条款27:尽量少做转型动作

    声明: 文中内容收集整理自<Effective C++(中文版)第三版>,版权归原书所有. 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正. 条款27: ...

  2. 条款27:尽量少做转型动作

    首先是C++提供的四种转型操作: 1. const_cast:常量性的转除. 2. dynamic_cast:安全的向derived class进行转型,可能会带来很高的开销 3. reinterpr ...

  3. 【Effection C++】读书笔记 条款01~条款04

    [Effection C++]读书笔记 Part1 让自己习惯C++ 条款01:视C++为一个语言联邦 将C++视为一个由相关语言组成的联邦.在其某个次语言中,各种守则简单易懂,容易记住.但当从一个次 ...

  4. 【Effection C++】读书笔记 条款20~条款23

    [Effective C++]Part4 设计与声明 条款20:宁以pass-by-reference-to-const替换pass-by-value 尽量以pass-by-reference-to- ...

  5. 【Effection C++】读书笔记 条款10~条款12

    [Effection C++]读书笔记 Part2 构造/析构/赋值运算 条款09:绝不在构造和析构函数中调用virtual函数 构造函数和析构函数期间不要调用virtual函数,虽然语法上并不会有错 ...

  6. 【Effection C++】读书笔记 条款05~条款06

    [Effection C++]读书笔记 Part2 构造/析构/赋值运算 条款05:了解C++默认编写并调用哪些函数 编译器可以暗自为class创建default构造函数,copy构造函数,copy ...

  7. 【Effection C++】读书笔记 条款29~条款30

    [Effective C++]读书笔记 Part5 实现 条款29:为异常安全而努力是值得的 当异常被抛出时,待哟异常安全性的函数会: 不泄漏任何资源. 不允许数据败坏. 异常安全函数提供以下三个保证 ...

  8. 【Effection C++】读书笔记 条款41~条款42

    [Effection C++]读书笔记 Part7 模板与泛型编程 条款41:了解隐式接口和编译器多态 本条款主要是讲述了两个概念,隐式接口和编译器多态 1. 显示接口和隐式接口 显示接口是由函数的签 ...

  9. 【Effection C++】读书笔记 条款07~条款08

    [Effection C++]读书笔记 Part2 构造/析构/赋值运算 条款07:为多态基类声明virtual析构函数 带有多态(polymorphic)性质的base classes应该声明一个v ...

最新文章

  1. 1.Spring Security 详细简绍与入门
  2. 关于读取数据库进行数据处理的一些小问题
  3. Spring-data-redis:特性与实例--转载
  4. 抽象工厂类--一个简单的例子
  5. zip:命令行下zip压缩/解压缩
  6. mysql死锁查询_Mysql 查看死锁,解除死锁 方式
  7. 车间生产能耗管控方案_如何给生产车间降温 环保空调的这些方案一定能帮到你...
  8. 信息学奥赛一本通 1159:斐波那契数列
  9. 关于String,StringBuffer和StringBuilder之间的区别和联系
  10. python使用ray框架改进原有代码,实现多进程与分布式
  11. atitit.提升开发效率---MDA 软件开发方式的革命(4)----编辑表单建模
  12. 输出一行数字,中间用空格隔开,最后一个数字没有空格
  13. 区块链(BlockChain)基础概念
  14. 攻击机靶机环境搭建——网络设置
  15. 吐血推荐:数据库你想知道的都在这
  16. 教你更划算的选择苹果最新产品Mac Studio
  17. WPF UnhandledException
  18. 2015 ACM Arabella Collegiate Programming Contest(F题)
  19. button type属性
  20. java代码读取excel文件,同时兼容2003和2007

热门文章

  1. 三星a9s参数_三星A9s参数配置怎么样
  2. pip安装了 但是python找不到_解决python明明pip安装成功却找不到包的问题
  3. 烽火HG680-KB_Hi3798MV310_当贝桌面_强刷及免拆_两种方法-卡刷固件包
  4. 第二届天府大地艺术季(春)分会场暨晨光社区系列主题活动开启
  5. uvm_primer ch7 static方法和变量
  6. 电源管理芯片的更新换代和各种应战
  7. 虚拟磁带库(VTL)的基本知识和采购指南
  8. 弦截法c语言求方程XeX-1=0的解,编程用弦截法求方程 f(x)=3x^3-5x^2+16x-60=0的根
  9. 山东大学项目实训之安卓reportActivity上报不良事件
  10. Docker系列 WordPress系列 动态对话页面