快速初始化成员变量

在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 }
原文地址:https://www.cnblogs.com/lniwn/p/3387543.html