C.2: 如果类具有不变式则用 class; 如果数据成员相互独立则使用 struct

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.