第十五章 友元、异常和其他

友元

友元类

表 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学习:第十五章的更多相关文章

  1. C++ Primer Plus学习:第五章

    C++入门第五章:循环和关系表达式 for循环 for循环的组成部分 设置初始值. 执行测试,看循环是否应该继续执行. 执行循环操作. 更新用于测试的值. 以上操作由括号括起,每个部分均是一个表达式, ...

  2. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 代码工程地址: https://g ...

  3. 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记

    第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...

  4. 【C++】《C++ Primer 》第十五章

    第十五章 面向对象程序设计 一.OOP:概述 面向对象程序设计(OOP)的核心思想是数据抽象.继承和动态绑定. 通过使用数据抽象,可以将类的接口和实现分离. 使用继承,可以定义相似的类型并对其相似关系 ...

  5. Gradle 1.12 翻译——第十五章. 任务详述

    有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...

  6. “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  7. “全栈2019”Java多线程第二十五章:生产者与消费者线程详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  8. “全栈2019”Java多线程第十五章:当后台线程遇到finally

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. “全栈2019”Java异常第十五章:异常链详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

随机推荐

  1. 运维与架构—Nginx的优缺点

    Nginx的优点是: 1.工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名.目录结构 它的正则规则比HAProxy更为强大和灵活,这也是它目前广泛流行的主要原因之一 Nginx ...

  2. 基于OpenCV的微信跳一跳外挂

    摘要:微信跳一跳是时下热门的微信小游戏,基本原理是根据按压屏幕的时间控制棋子跳过的距离,使其跳到下一个方块上:现利用Android adb工具,PC端获取实时截图,使用OpenCV库分析图片计算距离, ...

  3. 面试和工作中的map

    map是C++ STL中的关联容器,存储的是键值对(key-value),可以通过key快速索引到value.map容器中的数据是自动排序的,其排序方式是严格的弱排序(stick weak order ...

  4. MFC-控件操作及数据交换

    对控件进行操作函数如下: 1.ShowWindow() TURE为显示控件,FALSE为隐藏该控件: if(条件) GetDlgItem(ID)->ShowWindow(TRUE);//满足条件 ...

  5. 10 Quality Free Flat Icon Sets for Your Designs

    Subscribe It’s clear that flat design has gained great popularity in recent years. This is hardly su ...

  6. 20155305乔磊2016-2017-2《Java程序设计》第一周学习总结

    学习考核方式后感 老师对于成绩的获得有很多细节的地方,获得高分很不容易,考核次数也很多,100分分为课堂考核,实验,团队项目,老师对我们的要求可以说非常的严格,我也为有一个要求严格的老师感到幸运荣幸. ...

  7. week8课上实践

    课上练习. 第一题: 参考 http://www.cnblogs.com/rocedu/p/6766748.html#SECCLA 在Linux下完成"求命令行传入整数参数的和" ...

  8. 【LG3242】 [HNOI2015]接水果

    题面 洛谷 题解 20pts 对于\(n,P,Q\leq 3000\),暴力判断每条路径的包含关系然后排序\(kth\)即可,复杂度\(O(PQ\log P)\) 另30pts 原树为一条链. 发现对 ...

  9. tp框架-------验证码

    验证码我们一般很常见,在注册或登录时,都可以用的到,下面我们就来看看它的代码和用法 加验证码是为了防止表单攻击的一种方式,为了我们的程序更加的安全 在tp框架中它自带了一个验证码的类,我们先来看一下 ...

  10. OpenGL ES学习笔记(二)——平滑着色、自适应宽高及三维图像生成

    首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <Android学习笔记--O ...