C.2: 如果类具有不变式则用 class
; 如果数据成员相互独立则使用 struct
#
警告
为了便于读者理解, 将内容尽量适配到了教学大纲所用的 C++98, 因而存在对原文的曲解和言不达意, 有能力请尽量阅读原文.
简而言之:
要么
class
+ 构造函数 (+ 私用数据成员).要么
struct
+ 无构造函数 (+ 公用数据成员).
原因#
可读性.
易于理解.
使用
class
让程序员意识到需要一个不变式.这是一个有用的惯例.
注意#
不变式 是一个对象的成员必须满足的逻辑条件, 它由构造函数确立; 公共成员函数必须确保执行前后不变式依然成立.
一旦对象的不变式被确立 (一般由构造函数确立), 类的每个成员函数都可被该对象调用.
不变式可以非正式地说明 (例如在注释中说明, 该类的成员 int value_
必须大于 0
), 或者通过 Expects
进行检查 (尚未纳入标准).
如果所有数据成员都可以相互独立地发生改变, 那么不可能存在不变式.
示例#
1#include <string>
2
3struct Pair { // 数据成员间相互独立
4 public:
5 std::string name;
6 int volume;
7};
但是,
1class Month { /* ... */};
2
3class Date {
4 public:
5 // 验证 {year, month, day} 是合法的日期, 然后初始化
6 Date(int year, Month month, char day);
7 // ...
8
9 private:
10 int year_;
11 Month month_;
12 char day_;
13};
注意#
如果一个类具有私用数据成员, 使用者就不能再不使用构造函数的情况下完全初始化该类的对象. 因此, 类的定义者在提供构造函数的同时, 必须确立它的意义. 这实际上意味着定义者需要定义不变式.
建议#
检查那些全是私用数据成员的 struct
和具有公用数据成员的 class
.