《C++编程风格(修订版)》——2.3 物理状态的一致性-阿里云开发者社区

开发者社区> 开发与运维> 正文

《C++编程风格(修订版)》——2.3 物理状态的一致性

简介:

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

2.3 物理状态的一致性

C++编程风格(修订版)
在 string 类的第三个构造函数中将对函数的字符串参数进行复制。在这个构造函数中对 s 进 行了初始化,并将 string 对象置于明确定义的状态,但它对 len 的处理方式与前两个构造函数是 不一致的。在前两个构造函数中,len 是所分配的字符数组的长度。而在第三个构造函数中,len 却是字符串的长度——也就是字符数组的长度减 1。那么 len 到底应该是动态分配数组的长度还 是字符串的长度呢? len 的这两种含义都是有意义的,但在所有的构造函数及其他的成员函数中, 我们必须只能使用一种含义。除非 len 的含义是唯一的,否则成员函数将无法以一致的方式来解 释 string 对象的状态。

我们可以在前两个构造函数中,或者在第三个构造函数中来改正这个问题。通过观察在最后 一个构造函数(拷贝构造函数)以及成员函数 assign() 和 concat() 中对 len 的使用方式,我们可 以知道 len 的含义究竟是数组的长度还是字符串的长度。现在,我们来依次观察这三个函数。首先, 在拷贝构造函数中,len 的含义是数组的大小:
image

从拷贝构造函数对 len 的使用方式中,我们可以看到问题是在于第三个构造函数,也就是带 有字符指针参数的构造函数。其次,在成员函数 assign() 中,len 是被设置为字符串的长度,这却表明问题是在于前两个构造函数:
image

最后,在成员函数 concat() 中,情况将变得更糟糕,在这个函数中 len 的使用方式与其他成 员函数中的使用方式都不相同。

     ![image](https://yqfile.alicdn.com/74d11dddc4ac03c394aad0bdb21e57295e83fbf9.png)

一方面,如果 len 是数组的长度,那么在 concat() 中所分配数组的长度就会比所需数组的长 度大 1。另一方面,如果 len 是字符串的长度,那么在 concat() 中所分配数组的长度就会比所需 数组的长度小 1。因此,无论 len 是以上哪种含义,在函数 concat() 中分配的数组都存在着多 1 或者少 1 的错误。对于这种情况,程序员可能无法决定该如何来使用 len,因此也就无法解决这 个问题。在最初的程序中,string 对象的状态对于数据成员 len 的含义并没有一致的定义。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章