C.40: 如果类具有不变式, 则定义构造函数

C.40: 如果类具有不变式, 则定义构造函数#

原因#

这就是构造函数的用途.

示例#

 1class Date {  // Date 表示一个 [1990 年 1 月 1 日, 2100 年 12 月 31 日] 范围内的有效日期
 2 public:
 3  Date(int dd, int mm, int yy) : d{dd}, m{mm}, y{yy} {
 4    if (!is_valid(d, m, y)) throw Bad_date{};  // 强制保证不变式
 5  }
 6  // ...
 7
 8 private:
 9    int d, m, y;
10};

通常将不变式表示为构造函数里的 Ensure (尚未纳入标准) 是一个好主意.

注意#

即使类没有不变式, 也可以为了方便起见使用构造函数.

 1struct Rec {
 2 public:
 3  string s;
 4  int i{0};
 5  Rec(string const& ss) : s{ss} {}
 6  Rec(int ii) : i{ii} {}
 7};
 8
 9Rec r1{7};
10Rec r1{"Foo bar"};

通常将不变式表示为构造函数里的 Ensure (尚未纳入标准) 是一个好主意.

注意#

C++11 的初始化器列表规则消除了许多构造函数的需要. 例如:

1struct Rec2 {
2 public:
3  string s;
4  int i;
5  Rec2(string const& ss, int ii = 0) : s{ss}, i{11} {}  // 多余的
6};
7
8Rec2 r1{"Foo", 7};
9Rec2 r1{"Bar"};

Rec2 的构造函数是多余的. 同时, int 的默认值初始化最好使用 成员初始化器 完成.