《C++ Primer Plus》学习笔记9

第15章 友元、异常和其他

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

主要内容:

1)友元类

2)友元类方法

3)嵌套类

4)引发异常、try块和catch块

5)异常类

6)执行阶段类型识别(RTTI)

7)dynamic_cast和typeid

8)static_cast、const_cast和reiterpret_cast

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

1、对于Remote对象的TV方法。其原型可在Remote类声明之前声明,但必须在Remote类声明之后定义。以便编译器有足够的信息来编译该方法。

class Tv
{
friend class Remote;
public:
void buzz(Remote & r);
……
};
class Remote
{
friend class Tv:
public:
void Bool volup(Tv & t)
{
t.volup();
}
};
inline void Tv::buzz(Remote & r)
{
……
}

因为Remote的声明位于Tv声明的后面,所以能够在类声明中定义Remote::volup()。可是Tv::buzz方法必须在Tv声明的外部定义,使其位于Remote声明的后面。

共同的友元

须要使用友元的还有一种情况是,函数须要訪问两个类的私有数据,从逻辑上看,这种函数应是每一个类的成员函数。但这是不可能的,它能够是一个类的成员,同一时候是还有一个类的友元,只是有时将函数作为两个类的友元更加合理。

补充:友元使得可以为类开发更灵活的接口

2、嵌套类

在C++中,能够将类声明放在还有一个类中,在还有一个类中声明的类被称为嵌套类(nested class)。它通过提供新的类型类作用域来避免名称的混乱。

对类进行嵌套一般是为了帮助实现还有一个类。避免名称冲突。

补充:嵌套类是在其它类中声明的类,它有助于设计这种助手类。即实现其它类。但不必是公有接口的组成部分。

class Queue
{
//class scope definitions
//Node is a nested structure definition local to this class
struct Node
{
Item item;
struct Node * nest;
};
}

Node实际上是一个嵌套类。

1)嵌套类的作用域

假设嵌套类是私有部分声明的,则仅仅有后者知道它。前面Node类就是这样的情况。由于类的默认訪问权限是私有的;对于包括它的类是能够使用它;从包括它的类派生而来的类不能使用。外部世界也不能使用它。

假设嵌套类是保护分声明的。则仅仅有后者知道它。对于包括它的类是能够使用它;从包括它的类派生而来的类能使用。外部世界也不能使用它。

假设嵌套类是公部分声明的,对于包括它的类是能够使用它;从包括它的类派生而来的类能使用,外部世界也能使用它。

嵌套结构和枚举的作用域与这个同样。

3、异常

1)调用abort

处理方式,假设当中一个參数是还有一个參数的负值。则调用abort()函数

其典型实现是向标准错误流发送消息abnormal program termination(程序异常终止)

2)返回错误码

一种比异常终止更加灵活的方法是使用函数的返回值来指出问题。

3)异常机制

对于异常处理有三个组成部分

①引发异常

throw语句实际上是跳转。keyword表示引发异常,紧跟其后的值指出了异常的特征

②捕获有处理程序的异常

catchkeyword表示捕获异常

③使用try块

try块标识当中特定的异常可能被激活的代码块,它后面跟一个或多个catch块

补充:C++异常机制为处理拙劣的编程事件,如不适合的值,I/O失败等,提供了一种灵活的方式,引发异常将终止当前运行的函数。将控制权传给匹配的catch块。catch块紧跟在try块中的代码。

4、RTTI

RTTI是执行阶段类型识别

RTTI特性让程序可以检測对象的类型。dynamic_cast操作符用于将派生类指针转换为基类指针。其主要用途是确保可以安全的调用虚函数。

RTTI的工作原理:

C++有3个支持的RTTI的元素,

假设可能的话,dynamic_cast操作符将使用一个指向基类的指针来生成一个指向派生类的指针,否则,该操作符返回0——空指针。

typeid操作符返回一个指出对象的类型的值

type_info结构存储了有关特定类型的信息

RTTI仅仅适用于包括虚函数的类。

通常,假设指向的对象(*pt)的类型是Type或者是从Type直接或间接派生而来的类型。则表达式:dynamic_cast<Type *>(pt)将指针pt转换为Type类型的指针;否则。结果为0.即空指针。


05-11 22:04