zoukankan      html  css  js  c++  java
  • 快速初始化成员变量

    在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 }
  • 相关阅读:
    浅读《构建之法》
    def 和 lamdba的区别
    Numpy和Pandas的区别
    Django:每点击一次就增加行可输入的表格
    F函数和Q函数的作用
    super()的用法
    liunx操作系统
    celery(超详细)
    celery
    FastDFS环境搭建
  • 原文地址:https://www.cnblogs.com/lniwn/p/3387543.html
Copyright © 2011-2022 走看看