第15章 友元、异常和其他
1.友元不仅有友元函数,还能是友元类
还可以将类中的某一个成员函数指定为另一个类的友元
尽管友元被授予从外部访问私有部门的权限,单并不与面向对象编程思想相愽,相反,它们提高了公有接口的灵活性
2.类的成员函数作为其他类的友元,涉及到类的声明顺序。
还有一个函数作为两个类的友元
这方面内容看P607-611
3.嵌套类:在另一个类中声明的类被称为嵌套类
类嵌套与包含不一样。包含意味着将一个类对象作为另一个类的成员,而对类进行嵌套不创建类成员,而是定义了一种类型。
4.对类进行嵌套通常是为了帮助实现另一个类,并避免名称冲突。
5.嵌套类,结构和枚举在类中声明的作用域特征
声明位置 包含它的类是否可以使用它 从包含它的类派生而来的类是否可以使用它 在外部是否可以使用
私有部分 是 否 否
保护部分 是 是 否
公有部分 是 是 是,通过类限定符来使用
6.模板很适合作为嵌套类的定义
7.异常
调用std::abort()将会向标准错误流发送消息,然后终止程序
8异常机制
异常提供了将控制权从程序的一个部分传递到另一部分的途径
引发异常
使用处理程序捕获异常
使用try块
9.throw实际上是跳转。表示引发异常,紧接其后的值(如字符串或对象)指出了异常的特征
10.catch关键字表示捕获异常,随后位于括号中是类型声明,指出了要响应的异常类型
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编程练习 有时间做
C++ Primer Plus 第15章 友元、异常和其他,布布扣,bubuko.com