《C++编程风格(修订版)》——2.4 类不变性

本节书摘来自异步社区出版社《C++编程风格(修订版)》一书中的第2章,第2.4节,作者:【美】Tom Cargill,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.4 类不变性

C++编程风格(修订版)
对于每个类,我们都可以写出一组类不变性(Class Invariant)条件,在类的每个对象的生 存期内,这些条件都应该是成立的。例如,如果 len 是用来表示字符串的长度,那么 string 类的 一个不变性条件就是

image

类不变性与循环不变性是相似的。循环不变性在循环的起始阶段就开始起作用,并且在循 环的每次迭代中都将保持这个不变性。因此,循环不变性将一直持续到循环结束。同理,在每个 对象的生存期之内也需要保持类不变性。我们首先在构造函数中建立起类不变性,然后在其他成 员函数中维持这个不变性,这样就在对象的整个生存期内都保持了类不变性。

用一致的方式来定义对象的状态——这需要识别出类不变性。
在其他一些编程语言中,例如 Eiffel,提供了显式的语言机制来表示和检查类不变性。然而, 在 C++ 中并没有提供正式的语言机制来支持类不变性,而是由程序员来决定如何实现类不变性。

从这一点来说,类不变性就更加类似于循环不变性。如果一个 C++ 程序员在头脑中始终记着循 环不变性,那么他在编写循环时就有两种选择。在编写完循环之后,可以将不变性作为循环代码 的注释,或者将不变性作为一个断言整合到代码中(通过在标准头文件 assert.h 中定义的 assert 宏, 我们可以很容易地在代码中增加断言)。将不变性作为类的注释和将不变性作为循环的注释是一 样简单的,然而将类不变性作为断言整合到类的代码中则要更困难一些。在类的源代码中,需要 增加类不变性断言的地方可能不止一个。由于在每个成员函数中都需要保持类不变性,因此,在 每个可以改变对象状态的成员函数中都需要对断言进行测试。其中一种方法就是将所有的类不变 性断言集中到一个特殊的成员函数中,并在其他成员函数的开始部分或者结束部分(也可以在这 两个部分)调用这个特殊的成员函数。不过,很少有 C++ 程序员会去做这种麻烦的工作,相对而言, 将类不变性作为注释是更为普遍的做法。

在程序清单 2.2 中给出了一个 string 类,在这个 string 类中 len 的值和 strlen(s) 的返回值保持 一致。在类的声明中有一条注释语句,用来说明 len 的类不变性。类的每个成员函数都将遵循这 个不变性。

程序清单 2.2 string 类中的 len 是一致的
image

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值