嵌套类
将类声明放在另一个类中,在另一个类中声明的类被称为嵌套类。
嵌套类和访问权限
- 作用域
声明位置 | 包含它的类是否可以使用它 | 从包含它的类派生而来的类是否可以使用它 | 在外部是否可以用 |
---|---|---|---|
私有部分 | 是 | 否 | 否 |
保护部分 | 是 | 是 | 否 |
公有部分 | 是 | 是 | 是,通过类限定符来使用 |
异常
异常机制
对异常处理有3部分组成:
- 引发异常:可能有异常的代码块
- 使用try块:标识特定的异常可能被激活的代码块,表面需要注意这些代码引发的异常
- 使用处理程序捕获异常:catch关键字开头,括号中的类型声明,指出异常处理程序要响应的异常类型
throw终止函数的执行,并使得程序沿函数调用序列后退,直到找到包含try块的函数,即第一个这样的函数:包含能够捕获相应异常的try-catch。
栈解退:函数出现异常而终止,则程序将释放栈中内存,但不是释放栈的第一个返回地址后停止,而是基继续释放栈,直到找到一个位于try块的返回地址。随后,控制权将转到块尾的异常处理程序,而不是程序调用后面的第一条语句。
程序进行栈解退回到捕获异常的地方时,将释放栈中的自动存储型变量。如果变量是类对象,将为该对象调用析构函数。
在一个异常类层次结构,并处理不同的异常类型,则使用基类引用将能够捕获任何异常对象;而使用派生类对象只能捕获它所属类及从这个类派生而来的类对象。引发异常的对象将被第一个与之匹配的catch块捕获,这意味着catch块的排列顺序应该与派生顺序相反。
用省略号可以表示异常类型,捕获任何异常。
RTTI
运行阶段类型识别
- dynamic_cast运算符将使用一个指向基类的指针来生成一个指向派生类的指针;否则,该运算符返回空指针。
- typeid运算符返回一个指出对象的类型的值。
- type_info结构存储有关特定类型的信息。
dynamic_cast
dynamic_cast<Type *>(pt)
如果指向的对象(*pt)的类型为Type或者是从Type直接或间接派生而来的类型,则可以将指针pt转换为Type类型的指针,否则,结果为0,即空指针。
typeid运算符和type_info类
typeid运算符确定两个对象是否为同种类型,运算符返回一个对type_info对象的引用,接受两种参数:
- 类名
- 结果为对象的表达式
例如:typeid(Magnificent)==typeid(*pg)