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
的默认值初始化最好使用 成员初始化器 完成.