从C++11开始,类声明支持非静态成员的初始化,而在C++11之前,仅支持常整型静态成员初始化,新特征的支持,使得初始化变的灵活,很多时候可以减少代码量。

关于C++98的成员初始化

int var = 7;

class X {
  static const int m1 = 7;        // ok
  const int m2 = 7;               // error: not static
  static int m3 = 7;              // error: not const
  static const int m4 = var;      // error: initializer not constant expression
  static const string m5 = "odd"; // error: not integral type
  // ...
};

关于C++11的成员初始化

C++11支持在类声明成员时,初始化非静态成员,构造函数会在运行时自动使用初始化器(initializer)。

class A {
public:
  int a = 7;
};

// 等价于
class A {
public:
  int a;
  A() : a(7) {}
};

初始化器在多构造函数时的使用

如果类含有多个构造函数,每个构造函数都需要初始化相应的成员,这时使用初始化器就能减少不少代码量。

比如:

class A {
public:
  A() {}
  A(int a_val) : a(a_val) {}
  
private:
  int a = 7;
  int b = 5;  
  HashingFunction hash_algorithm{"MD5"};
  std::string s{"Constructor run"};
};

成员同时被初始化器以及构造函数初始化

这时,只有构造函数的初始化会执行,它会覆盖默认的初始化器。在上面的例子中,构造函数A(int a_val)对a的初始化会覆盖默认的初始化器(int a = 7;)。

参考