构造函数的初始化

2017-03-29  本文已影响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){}
};
上一篇下一篇

猜你喜欢

热点阅读