Abrahams我们有三种类型的例外:
基本意味着(请纠正我,如果我错了)保留不变量,例如保留组件的不变量,并且没有资源泄露,其中操作具有强要么成功完成,要么抛出异常,使程序状态与操作开始前完全一致。
保留不变量是什么意思?如果我的一个变量中有一个有效值,那么它不会(例如一个指针)持有NULL
?
参考强异常保证,是否意味着在抛出异常之前我的所有变量都会存储完全相同的值?
例如:
int main()
{
int j = 1;
int *p = &j;
// do some stuff
j = 2;
throw 1;
}
然后在我抛出后,j
会保留值2
或1
?
此致
答案 0 :(得分:9)
基本保证:抛出异常后,对象将保持一致,可用的状态。没有资源泄露,invariants被保留。对象的状态可能已更改,但仍可使用。例如,day
值已变为-1的日期对象不再可用,因为其不变量表示day
在[1,31]范围内。
强保证(除1之外):日期对象的值为2012-12-31。尝试修改该值失败的操作后,该对象的值仍为2012-12-31。也许一些内部状态已经改变,但从客户的角度来看逻辑状态没有改变。
答案 1 :(得分:4)
在您的情况下,没有例外保证。 (这基本上是案例0)。您引用的维基百科文章很清楚:“规则适用于类实现”。此外,抛出后,变量j
超出范围且不再存在。你甚至不能再谈论它的地址,更不用说价值了
通常,类不变量是由类作者定义的,因此它意味着类作者的意思。我不明白你的观点1. NULL
是指针的有效值。
你的第二点是好的。定义不是绝对的。例如,对字符串数据成员的操作可以增加其容量。你可以通过const&
在外面观察到这一点。然而,该字符串容量通常不被视为字符串值的一部分,因此不作为类不变量的一部分。