美文网首页
构造函数的初始化

构造函数的初始化

作者: 一叶之界 | 来源:发表于2017-03-29 13:46 被阅读0次

    构造函数的初始化和其他函数一样,有自己的形参、名字和逻辑,但不同的是构造函数可以有初始化列表。

    // 案例:
    class num
    {
      private:
        int a;
        int b;
        int c;
      public:
        /*1. 构造函数的初始化列表以冒号开始的;
           2. 用逗号将每一个数据成员隔离开;
           3. 每一个数据成员后面都有一个小括号,里面是数据成员的初始化值。
           注意:构造函数初始化式只在构造函数的定义中而不是声明*/
        num::num:a(1), b(2), c(0){}
    };
    

    省略构造函数初始化列表,并在构造函数体内初始化也是合法的,例如:

    num::num(){a = 1; b = 2; c = 0;}
    

    在什么情况下使用初始化列表
    数据成员中有引用,const或者没有默认构造函数的类类型的任何成员使用

    // 案例:
    class num 
    {
      private:
          int a;
          const int b;
          int &c;
      public:
          num::num:a(1), b(2), c(0){}
    };
    

    成员初始化的次序

    类中的每一个数据成员在构造初始化列表中只能被初始化一次。
    构造函数初始化列表仅指定初始化成员的值,而不指定执行初始化的次序。初始化的次序和定义数据成员的次序是一样的。

    // 案例:
    class num
    {
      private:
          int a;
          int b;
          int c;
      public:
          // error: a is initialzied before b
          /*initialzied list: In fact, it used the not initialzied b to initialzied a.
             so when we want to initialzie member datas, we should accord to the define sequence;
             or all can't use member data to initialize the member data*/
          num::num(int value): b(value), a(b), c(b){}
          // right
          num::num(int value):a(value), b(value), c(value){}
    };
    

    初始化式可以是任意表达式

    class num
    {
      private:
          int a;
          int b;
          int sum;
      public:
          num::num(int l, int j, int k):a(l), b(j), sum(k + j){}
    };
    

    类类型的数据成员的初始化式

    class student
    {
      private:
          string name;
          int id;
      public:
          // name:用5个字符串na表示;
          // string的构造函数:接受一个计数值和一个字符串,生成一个新的string,来保存重复指定次数的字符
          student::student:name(5, 'na'), id(0){}
    };
    

    相关文章

      网友评论

          本文标题:构造函数的初始化

          本文链接:https://www.haomeiwen.com/subject/dzreottx.html