成员初始化器: 构造函数的冒号是啥?#
为了维护 不变式, 我们将数据成员设为私用; 为了建立不变式, 我们定义构造函数:
1class Widget {
2 public:
3 Widget(int value) {
4 value_ = value; // 用参数 value 赋值数据成员 value_
5 }
6
7 private:
8 int value_;
9};
注意到, 我将私用数据成员命名为 value_
, 这样就避免了与参数名字 value
或其他什么产生冲突, 从而不需要采取某些 糟糕手段:
1class Widget {
2 public:
3 Widget(int a) { // 鬼知道 a 是啥
4 value = a;
5 }
6
7 private:
8 int value;
9};
1class Widget {
2 public:
3 Widget(int v) { // 鬼知道 v 代表 value
4 value = v;
5 }
6
7 private:
8 int value;
9};
1class Widget {
2 public:
3 Widget(int value) {
4 // ↓ 用 this 来明确是在访问成员
5 this->value = value; // 看着不累吗
6 }
7
8 private:
9 int value;
10};
但运行到构造函数体内时, 所有成员其实已经构造好了, 我们 value_ = value
不是在构造时初始化成员, 只是在对已经构造的成员进行赋值: 如果把构造时初始化比喻为修建房屋, 赋值就是你已经住了一段时间后再对房子进行装修.
为了对成员进行构造, 我们在函数体之前使用成员初始化器:
1class Widget {
2 public:
3 Widget(int value) : value_{value} {}
4
5 private:
6 int value_;
7};