C++ Primer Plus学习:第十五章
第十五章 友元、异常和其他
友元
友元类
表 0-1
|
class Tv { public: friend class Remote; } |
Remote类可以使用Tv的数据成员,Remote类在Tv类后定义 。
友元成员函数
表 0-2
|
class Tv; //前向声明 class Remote { public: void chanup(Tv &t); } class Tv { public: friend void Remote::set_chan(Tv& t, int c); } |
异常处理
对异常的处理有三个部分组成:
- 引发异常
- 使用处理程序捕获异常
- 使用try块
表 0-3
|
try(z=hmean(x,y);) catch(bad_hmean & bg) { bg.mesg(); continue; } catch(bad_gmean & hg) { cout<<hg.mesg(); break; } |
|
double hmean(double a,double b) { if(a==-b) throw bad_hmean(a,b); return 2.0*a*b/(a+b); } |
|
double gmean(double a,double b) { if(a<0||b<0) throw bad_gmean(a,b); return std::sqrt(a*b); } |
发生异常后,返回到离语句最近的匹配的catch结构中,跳出的函数的自动变量被释放,类的析构函数被调用。
exception类
stdexcept类继承于基类exception类。定义了logic_error类和runtime_error类,公有派生。
logic_error类中的错误类型:
domain_error:定义域错误
invalid_argument:无效变量
length_error:没有足够空间。string的append操作空间不足
out_of_bounds:索引错误
runtime_error类:运行期间的错误
range_error:计算结果不在函数允许的范围内,但是不是上溢或下溢错误。
overflow_error:上溢错误,超过最大值
underflow_error:下溢错误,小于最小的非零值
RTTI(Runtime Type Identification)运行阶段类型识别-只适用于有虚函数的类,只有对于这种类的层次结构,才应该将派生对象的地址赋给基类指针。
dynamic_cast运算符:最常用的RTTI组件
Superb *pm=dynamic_cast<Superb *>(pg);
若pg的类型能够被安全地转化为Superb*,如果可以,返回对象的地址,否则,返回一个空指针。
dynamic_cast<Type*>(pt);正确,返回Type*,否则,返回0。
typeid使得能够确定两个对象是否为同种类型,可接受两个参数:类名和结果为对象的表达式。返回值为type_info对象的引用。
typeid(Magnificent)==typeid(*pg);
pg为空指针会抛出异常bad_typeid。type_info含有name()函数,返回类名。
const_cast<type-name> (expression) 转变为const或者volatile类型,typename与expression类型相同
static_cast<type-name>(expression) type-name转化为expression或者expression转化为type-name时均可使用。枚举/整型互转,double/int互转。
reinterpret_cast<type-name>(expression)
函数指针不可转化为数据指针,指针不能转为整型或者浮点
C++ Primer Plus学习:第十五章的更多相关文章
- C++ Primer Plus学习:第五章
C++入门第五章:循环和关系表达式 for循环 for循环的组成部分 设置初始值. 执行测试,看循环是否应该继续执行. 执行循环操作. 更新用于测试的值. 以上操作由括号括起,每个部分均是一个表达式, ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 代码工程地址: https://g ...
- 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记
第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...
- 【C++】《C++ Primer 》第十五章
第十五章 面向对象程序设计 一.OOP:概述 面向对象程序设计(OOP)的核心思想是数据抽象.继承和动态绑定. 通过使用数据抽象,可以将类的接口和实现分离. 使用继承,可以定义相似的类型并对其相似关系 ...
- Gradle 1.12 翻译——第十五章. 任务详述
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
- “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第二十五章:生产者与消费者线程详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第十五章:当后台线程遇到finally
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java异常第十五章:异常链详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
随机推荐
- KKT原理以及SVM数学的理论推导分析
一直很好奇机器学习实战中的SVM优化部分的数学运算式是如何得出的,如何转化成了含有内积的运算式,今天上了一节课有了让我很深的启发,也明白了数学表达式推导的全过程. 对于一个SVM问题,优化的关键在于 ...
- docker 容器模式下部署mysql 主从复制
1.计划用两台host来部署,分别部署一台 mysql,一主一从,2.配置好主从mysql配置文件,更改文件名即可[client]port = 3306socket = /var/run/mysqld ...
- Java 访问控制规则简介
1. 概述 老生常谈的内容 巩固一下自己 要摇摇欲坠的基础 内容确实不怎么高级... 2. 常规解释 1. 概述 简单说下什么情况 在单纯考虑 public, protected, 以及 privat ...
- Linux入门第二天——基本命令入门(中)
一.文件搜索命令 1.文件搜索命令:locate 速度很快(具体见Linux工具网址的对比),注意无法找到新建的文件(原理暂不展开) locate命令其实是“find -name”的另一种写法,但是要 ...
- 任务队列和异步接口的正确打开方式(.NET Core版本)
任务队列和异步接口的正确打开方式 什么是异步接口? Asynchronous Operations Certain types of operations might require processi ...
- Eclipse 使用过程中的问题及解决方法
1.Eclipse中java文件和jsp字体大小设置 1.更改所有文件的字体显示大小过程: Window->preferences->General->Appearance-> ...
- php小项目小结
最近一直断更,并不是出于什么问题,而是想找个合适的机会去整理下html基本的一些琐碎的知识点 近期突发感冒,吊水,吊错药,原因只是重名重姓,这不是个梗,很是痛苦的现实事故 so,只能用剩下的半天去完成 ...
- VIN码识别/车架号识别独家支持云识别
VIN码(车架号)对于懂车的人来说并不陌生,不要小看这一串字符,从VIN码中可以读懂车辆的生产厂家.年代.车型.车身型式及代码.发动机代码及组装地点等信息. 一辆汽车的VIN码也是车辆的唯一身份证明, ...
- charles基本使用文档
Charles 主要的功能包括: 截取 Http 和 Https 网络封包. 支持重发网络请求,方便后端调试. 支持修改网络请求参数. 支持网络请求的截获并动态修改. 支持模拟慢速网络. Charle ...
- Linux权限管理命令
查询linux命令用法网址:cht.sh 1.chmod——改变文件/目录的权限 用法: ① chmod [{ugoa}{+-=}{rwx}] [文件/目录] ---给文件的(用户.所属组.其他人 ...