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

友元

友元类

表 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. Python基础学习笔记(一)安装以及IDE的配置

    一.初识Python Python官方网站:www.python.org 版本:python-3.4.3.amd64 初次接触Python,没有使用Python 2.x进行开发真实项目的经历.所以不知 ...

  2. BigData:值得了解的十大数据发展趋势

    当今,世界无时无刻不在发生着变化.对于技术领域而言,普遍存在的一个巨大变化就是为大数据(Big data)打开了大门,并应用大数据技相关技术来改善各行业的业务并促进经济的发展.目前,大数据的作用已经上 ...

  3. nRF52832 BLE_DFU空中升级OTA(二)编译下载(SDK14.2.0)

    上一篇配置好了开发环境,现在就可以试着跑一下例程了,这里需要两个例程,一个是bootloader的,一个是应用程序的,其路径分别为: bootloader:SDK_14.2.0工程\examples\ ...

  4. mysql 日志log

    my.ini log-error=D:/phpStudy/PHPTutorial/MySQL/log/error.loglog=D:/phpStudy/PHPTutorial/MySQL/log/my ...

  5. DVWA:环境搭建

    0x01 安装PHP集成环境 我这里用的是phpstudy 2016,这个使用起来比较方便.下面是现在的最新版. http://www.phpstudy.net/phpstudy/phpStudy20 ...

  6. 配置redis一直启动

    1. 进入 DOS窗口 2. 在进入redis的安装目录 3. 输入:redis-server --service-install redis.windows.conf --loglevel verb ...

  7. Button控件双击事件不执行

    Button控件双击事件不执行 最近组态组新加入了一位同事,该同事原先是做ASP.NET的,没有做过WindowForm的开发.所以就先安排一个小示例来测验一下.这个示例有些年头了,当年我进入组态开发 ...

  8. HDFS(0.20.2)运营中急救方案

    这段时间折腾的都是hadoop和lucene,总结了hadoop在运营过程中出现问题时的解决方案,请大家指教! HDFS(0.20.2)运营中急救方案 1           Namenode 挂掉( ...

  9. 20155209林虹宇虚拟机的安装及一点Linux的学习

    预备作业3 虚拟机的安装 首先,我先了解了一下Linux和安装虚拟机的有关常识. Linux:Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支 ...

  10. C#基础之Equals和Dispose

    1.equal()和运算符==的区别 由于C#中有值类型和引用类型,那么相等也分为值相等和引用相等.先来看一个值类型简单的例子,顺便也写了string类型的比较. static void Main(s ...