第15章 友元、异常和其它
1.友元不仅有友元函数。还能是友元类
还能够将类中的某一个成员函数指定为还有一个类的友元
虽然友元被授予从外部訪问私有部门的权限。单并不与面向对象编程思想相愽,相反。它们提高了公有接口的灵活性
2.类的成员函数作为其它类的友元,涉及到类的声明顺序。
还有一个函数作为两个类的友元
这方面内容看P607-611
3.嵌套类:在还有一个类中声明的类被称为嵌套类
类嵌套与包括不一样。
包括意味着将一个类对象作为还有一个类的成员,而对类进行嵌套不创建类成员。而是定义了一种类型。
4.对类进行嵌套一般是为了帮助实现还有一个类,并避免名称冲突。
5.嵌套类,结构和枚举在类中声明的作用域特征
声明位置 包括它的类能否够使用它 从包括它的类派生而来的类能否够使用它 在外部能否够使用
私有部分 是 否 否
保护部分 是 是 否
公有部分 是 是 是,通过类限定符来使用
6.模板非常适合作为嵌套类的定义
7.异常
调用std::abort()将会向标准错误流发送消息,然后终止程序
8异常机制
异常提供了将控制权从程序的一个部分传递到还有一部分的途径
引发异常
使用处理程序捕获异常
使用try块
9.throw实际上是跳转。表示引发异常,紧接其后的值(如字符串或对象)指出了异常的特征
10.catchkeyword表示捕获异常,随后位于括号里是类型声明,指出了要响应的异常类型
11.引发异常的函数将传递一个对象。这种优点是使用不同的异常类型来区分不同的函数在不同的情况下引发的异常
12.异常规范 样例
double harm(double a)throw(bad_thing); 表示仅仅会抛出bad_thing类型的异常
double marm(double) throw(); 表示不会抛出异常
出如今函数原型和函数定义中。可包括类型列表,也可不包括
13.异常出现会栈解退,直到遇到第一个try块,过程中自己主动变量会释放,动态变量也会被调用析构函数
14.引发异常是编译器总是创建一个暂时拷贝,这样子catch块的类型使用引用。
优点是基类引用能够获取子类出来的异常
15假设有一个异常类继承层次结构,应该这样排列catch块:将捕获位于层次结构最以下的异常类的catch
语句放在最前面。将捕捉基类异常的catch语句放在最后面
16.有一些标准的异常类P632
17.对未捕获异常和意外异常进行处理P639-P642
18.RTTI 执行阶段类型识别(Runtime Type Identification)
RTTI仅仅适用于包括虚函数的类
19.dynamic_cast运算符 不能回答“指针指向的是哪类对象”。但能够“能否够安全地将对象的地址赋给特定类型的指针”
如Super * pm = dynamic_cast<Super*>(pg)
指针pg的类型能否够安全地转换成Super*.能够,则返回对象的地址,否则返回一个空指针
通用 Type* pm = dynamic_cast<Type*>(pt)
20.typeid运算符和type_info类。
typeid能够接受两种參数:类名;结果为对象的表达式
typeid返回一个type_info对象的引用。
通过type_info的重载运算符 == 和 !
= 能够对类型进行比較
如typeid(Magnificent) == typeid(*pg)
检查pg指向的对象类型是否是Magnificent
P647
21.类型转换运算符
4个类型转换运算符
dynamic_cast<type-name>(expression) 推断expression能否转换成type-name
const_cast<type-name>(expression) 将类型中的const属性去掉
static_cast<type-name>(expression) type-name和expression两者能够隐式转换时。就合法。
包括基类转换成子类的指针或引用
reinterpret_cast<type-name>(expression) 是不做不论什么处理,将内存字节拷贝的方法。有一些限制,查看P652
15.8编程练习 有时间做