这个单“ :”是啥语法


SavingsAccount::SavingsAccount(int date, int id, double rate)
    :id(id), balance(0), rate(rate), lastDate(date), accumulation(0) {
    cout << date << "\t#" << id << "is created" << endl;
}

构造函数使用初始化列表的写法规定

img

img

img

img

img

img


https://img-mid.csdnimg.cn/release/static/image/mid/ask/059664922546122.png

img

《C++ Primer中文版 5th》P258有描述。这是固定用法。
执行到构造函数体时,class数据成员已经(隐式)初始化了。而有一些class数据成员,需要在这之前用调用者指定值进行显式初始化,那么要如何进行?
可以在构造函数后,通过加": 成员的构造函数初始值"的形式,来对数据成员进行初始构造。

class ConstRef {
public:
  ConstRef(int ii);
private:
  int i;
  const int ci;
  int &ri;
};
// 构造函数写法1:用构造函数初始值
ConstRef::ConstRef(int ii) : i(ii), ci(ii), ri(i) { } // 正确:这里会对i, ci, ri按成员声明顺序进行构造,调用其构造函数

// 构造函数写法2:不用构造函数初始值
ConstRef::ConstRef(int ii) { // 构造函数体"{"之前,编译器就已经对数据成员i, ci, ri进行了默认构造(初始化)(隐式调用,用户不可见)
  i = ii;   // 语法正确
  ci = ii; // 错误:不能再对const 类型的ci进行赋值
  ri = i;  // 错误:引用ri没被初始化
}