成员初始化器: 构造函数的冒号是啥?

成员初始化器: 构造函数的冒号是啥?#

为了维护 不变式, 我们将数据成员设为私用; 为了建立不变式, 我们定义构造函数:

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};

但运行到构造函数体内时, 所有成员其实已经构造好了, 我们 value_ = value 不是在构造时初始化成员, 只是在对已经构造的成员进行赋值: 如果把构造时初始化比喻为修建房屋, 赋值就是你已经住了一段时间后再对房子进行装修.

为了对成员进行构造, 我们在函数体之前使用成员初始化器:

1class Widget {
2 public:
3  Widget(int value) : value_{value} {}
4
5 private:
6  int value_;
7};