August 2021
Intermediate to advanced
450 pages
5h 35m
Chinese
使用异常报告越界访问错误是一个典型的函数检查其实参的例子,因为基本假设,即所谓的前置条件(precondition)没有满足,函数拒绝执行。如果我们正式说明Vector的下标运算符,我们将定义类似于“索引必须在[0:size())范围内”的规则,而这正是在operator[]()中要检查的。符号[a:b)指定了一个半开区间,表示a是区间的一部分,而b不是。每当定义一个函数时,就应考虑它的前置条件是什么以及如何检验它(参见3.5.3节)。对大多数应用来说,检验简单的不变式是一个好主意,参见3.5.4节。
但是,operator[]()对Vector类型的对象进行操作,而且只在Vector的成员有“合理”的值时才有意义。特别是,我们说过“elem指向一个含有sz个double的数组”,但这只是注释中的说明而已。对于类来说,这样一条关于假设某事为真的声明称为类不变式(class invariant),简称为不变式(invariant)。建立类的不变式是构造函数的任务(从而成员函数可以依赖该不变式),成员函数的责任是确保当它们退出时不变式仍然成立。不幸的是,我们的Vector构造函数只履行了一部分职责。它正确地初始化了Vector成员,但是没有检验传入的实参是否有效。考虑如下情况:
这条语句很可能会引起混乱。
下面是一个更好的定义:
本书使用标准库异常length_error报告元素数目为非正数的错误,因为一些标准库操作也是用这个异常报告这种错误。如果new运算符找不到可分配的内存,那么就会抛出std::bad_alloc。可以编写如下代码: ...
Read now
Unlock full access