您的位置:首页 > 其它

11、12章(异常处理和范型算法)

2007-05-21 14:01 246 查看
1、异常对象总是在抛出点被创建,所以throw表达式抛出的异常,要么是一个异常类的有名对象,要么通过对异常类构造函数调用语法,抛出一个异常的类的无名对象,然后把这个临时对象拷贝到一个被称为异常对象的存储区,以保证该异常能够一直存在到其被处理完毕。catch子句捕获异常对象的情况类似于函数调用,同样也有传址和传值两种方式,为了不拷贝大型的异常类对象或者为了确保应用在本catch子句中的异常对象上的修改操作能够反映到被重新抛出的异常对象上,应该采用传址方式。且注意catch子句完成它的工作后,程序的执行将在catch子句列表的最后子句之后继续进行,这点不同于函数调用,此外,还有一个主要区别是:建立函数调用所需要的全部信息在编译时刻已经获得,而对异常处理则需要运行时刻的支持。

2、catch_all(catch(...))对于任何类型的异常都会进入这个子句,主要是为了释放一些资源(因为异常处理有可能跳过函数内部的资源释放语句)。且注意catch子句被检查的顺序与它们在try块之后出现的顺序相同,一旦找到一个匹配,则后续的catch子句不在检查。所以如果catch(...)与其他catch子句联合使用,它必须总是被放在异常处理代码的最后,否则就会产生一个编译时刻错误。

3、异常规范在函数声明中列出该函数可能抛出的所有异常,它保证该函数不会抛出其他任何类型的异常,且注意函数声明和定义中都要指明相同的异常规范,被抛出的异常类型和异常规范中指定的类型不允许进行任何的类型转换(同样,运行时机制,编译可通过)。但是如果在函数指针赋值的语句中,两个指针的异常规范不一定要相同,只要求用作初始值或右值的指针规范必须与被初始化或赋值的指针异常规范一样或更严格。

4、由于函数指针作为函数实参时它的间接引用不能被内联的缺点,C++中引入了替代策略函数对象,函数对象是一个类,其内部重载了函数调用操作符[operater()],该操作符封装了通常被实现为一个函数的动作。典型情况下,函数对象被用作实参传递给范型算法,当然我们也可以定义独立的函数对象。相比于函数指针,函数对象还有一个优点是可以拥有任意数目的额外数据,用这些数据可以缓冲结果。

5、函数对象的三种来源:1 标准库预定义的一组算术、关系和逻辑函数对象(#include <functional>),每个对象都是一个类模板,每个类对象都可以作为有名对象,也可以作为无名对象传递给一个函数; 2 一组预定义的函数适配器,允许我们对预定义的函数对象(甚至于任何函数对象)进行特殊化或者扩展。又分为绑定器(binder)和取反器(negator),binder(有bind1st,bind2st两种)通过把二元函数对象的一个实参绑定到一个特殊的值上,将其转换成一元函数对象,negator(not1,not2)将一个函数对象的值翻转; 3 我们自己定义的函数对象。

6、几种iterator: 1:c++要求绑定在const容器上的iterator也必须是const iterator,如const vector<int> ivec; vector<int>::const_iterator iter = vec.begin();; 2:插入iterator,由于vector<int> ivec;ivec的容量为0,所以不支持有些范型算法的拷贝操作, 此时标准库采用的策略是,定义一组(三个)插入iterator适配器函数(back_inserter(),frond_inserter(),inserter()),它们返回特定的插入iterator。如:unique_copy (vec.begin(), vec.end(), inserter(ivec,ivec.begin() )),注意标记起始插入位置的iterator(ivec.begin())并不保持不变,而是随着每个被插入元素而递增,这样每个元素都能够顺序插入。 3:反向iterator,一个从末元素到首元素遍历容器的iterator,对其的++操作,访问的是前面的元素,定义为vector<type>::reverse_iterator riter = vec.rbegin(); 4:iostream iterator支持在一个输入、输出文件流上的iterator操作(#include <iterator>),注意我们使用专门的istream_iterator的缺省构造函数来定义输入流的结束位置。

8、范型算法的小结:1、所有范型算法的前两个实参都是一对iterator,通常被称为first和last,它们标记出要操作的容器或者内置数组的元素范围。 2、有一些算法支持多个版本,一个用内置操作符,一个接收函数对象或者函数指针,一般来说第二种版本都以后缀_if出现,如find_if()、replace_if,但是unique()是个例外; 3、对于那些修改所操作容器的算法,一般也有两种版本,一种实地版本,改变被应用的容器,另一种版本返回一个带有这些变化的容器副本,如replace_copy() 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: