从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;
)。