在C++98中,可以在头文件类的声明中使用“=”来给成员变量初始化,但是要求却很苛刻,被初始化的成员变量必须是:静态整形常量或者静态枚举类型。
1 class Init { 2 public: 3 Init():a(0){} 4 Init(int d):a(d){} 5 6 private: 7 int a; 8 const static int b = 0; 9 int c = 1; // 成员,无法通过编译 10 static int d = 0; // 成员,无法通过编译 11 static const double e = 1.3; // 非整型或枚举类型,无法通过编译 12 static const char *const f = "e"; // 非整型或枚举类型,无法通过编译 13 };
g++编译器对于第11行和12行的静态常量就地初始化是支持的,但是这只是GNU对C++的扩展,并不是标准C++。
在C++ 11中,允许非静态成员变量的初始化有多种形式。除了初始化列表外,在C++ 11中,还允许使用等号=或者花括号{}进行就地初始化。比如:
1 struct Init 2 { 3 int a = 1; 4 double d{1.2}; 5 string s("Hello"); // 无法通过编译,{}与()是不等价的 6 };
C++ 11标准支持了就地初始化非静态成员变量,同时,初始化列表也被保留了下来。如果两者都使用,则初始化列表的优先级更高。
1 #include <iostream> 2 using namespace std; 3 4 struct Mem { 5 Mem() {cout << "Mem default, num: " << num << endl;} 6 Mem(int i):num(i) {cout << "Mem, num: " << num << endl;} 7 int num = 2; // 使用=初始化非静态成员变量 8 }; 9 10 class Group { 11 public: 12 Group() {cout << "Group default, val:" << val << endl;} 13 Group(int i) val('G'), a(i) {cout << "Group, Var: " << val << endl;} 14 void NumofA() {cout << "number of A: " << a.num << endl;} 15 void NumofB() {cout << "number of B: " << b.num << endl;} 16 17 private: 18 char val{'g'}; // 使用{}初始化非静态成员 19 Mum a; 20 Mum b{19}; // 使用{}初始化非静态成员 21 }; 22 23 int main() 24 { 25 Mem member; // Mem default, num: 2 26 Group group; // Mem default, num: 2 27 // Mem, num: 19 28 // Group default, val: g 29 30 group.NumofA(); // number of A: 2 31 group.NumofB(); // number of B: 19 32 33 Group group2(7); // Mem, num: 7 34 // Mem, num: 19 35 // Group, val: G 36 37 group2.NumofA(); // number of A: 7 38 group2.NumofB(); // number of B: 19 39 return 0; 40 }