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

友元

友元类

表 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. .NET Core On Liunx环境搭建之MongoDB

    伴随着.NET Core的开源,Liunx服务器才是.NET 的未来,公司前几天刚刚上新了一台Liunx服务器,我进行了一下环境的搭建,把经验分享出来. 服务器信息:  服务器用的是阿里云服务器,操作 ...

  2. Go语言中映射表map的使用

    1 概述 Go语言中的键值对(key->value)集合,称之为映射map.映射map是变长类型,定义时不需要指定长度.映射map是无序的,遍历是的顺序不可期,原因是底层由hash表实现.逻辑结 ...

  3. Circos Ubuntu 安装

    下载: http://www.circos.ca/software/download/circos/ Perl 需要5.8及以上的版本. 查看版本的命令:    perl -v 解压安装包 安装包是一 ...

  4. R语言学习笔记—组合数

    组合数:从m个不同元素中取出n(n≤m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数. 代码: str_comb <- function(vector){ n <- l ...

  5. Oracle入门第三天(上)——多表查询与分组函数

    一.多表查询 所有的连接分析,参考之前随笔:http://www.cnblogs.com/jiangbei/p/7420136.html 1.笛卡尔积 select last_name, depart ...

  6. Linux入门——shell脚本常用信息小结

    1.shell中的$默认变量    $n           $1 表示第一个参数,$2 表示第二个参数 ...    $#           命令行参数的个数    $0           当前 ...

  7. 20155235 2016-2017-2 《Java程序设计》第十周学习总结

    20155235 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 计算机网络 计算机网络由若干结点和连接这些结点的链路组成.网络中的结点可以是计算机.集线器. ...

  8. 微信小程序居中代码

    html页面: { text-align:center; } wxss页面: { width: 100%; height: 100%; display: flex; justify-content: ...

  9. 洛谷3197&bzoj1008 越狱

    洛谷3197&bzoj1008 越狱 Luogu bzoj 题解 所有状态减合法状态.SBT 答案为\(m^n-m*(m-1)^{n-1}\)太SB不解释 注意取膜的问题.相减可能减出负数,而 ...

  10. hive 动态分区插入

    首先需要进行以下设置: set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict; se ...