C++之构造函数

构造函数:

  类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这个特殊的成员函数就是构造函数。只要类的对象被创建,就会执行构造函数。

  注:构造函数的名字必须和类名相同;构造函数没有返回值;构造函数不能被声明成const的(why?);构造函数默认为内联函数;

默认构造函数:

  如果一个类没有显式的定义构造函数,那么编译器将会为我们隐式的定义一个默认构造函数(合成的默认构造函数);默认构造函数无需实参;

  这个默认构造函数将会根据如下规则初始化类的数据成员:  

  • 如果存在类内的初始值,用它来初始化成员;
  • 否则,默认初始化该成员;

  只有不包含任何构造函数的情况下才会生成默认构造函数,而且一旦我们定义了一些其他的构造函数,那么除非我们再定义一个默认的构造函数,否则类将没有构造函数。

  注:一般情况下最好定义一个自己的默认构造函数,避免合成的默认构造函数可能执行错误的操作;

  

class Sales_data{
  Sales_data() = default;//这是一个默认构造函数,在C++11中,如果需要默认的行为,那么可以在参数列表后面写上=default来要求编译器生成构造函数,而且=default
               //可以写在类的内部(内联的),也可以写在类的外部   std::string bookNo;   unsigned units_sold = 0;   double revenue = 0.0; };

 

构造函数初始值列表

  如果没有在构造函数的初始化列表中显式地初始化成员,则该成员将在构造函数体之前执行默认初始化。(也就是说初始化列表中的内容是初始化成员,而构造函数体中的内容是给成员赋值,所以随着构造函数体一开始执行,初始化也就完成了)

  为什么需要初始化列表?

    当成员时const或者是引用的话,必须将其初始化,可是定义时并未初始话,这时就需要在构造的时候进行初始化了,但是构造函数体中进行的是赋值操作,所以  使用初始化列表来实现初始成员操作。

  例如:

  class ConstRef{

  public:

    ConstRef(int ii);

  private:

    int i;

    const int ci;

    int &ri;

  };

  我们知道成员ci和ri都必须初始化,因此如果我们没有为它们提供构造函数初始值的话将引发错误:

  ConstRef::ConstRef(int ii)

  {

    i = ii;

    ci = ii;       //error

    ri = i;  //error

  }

  所以,正确的构造函数为:

  ConstRef::ConstRef(int ii): i(ii),ci(ii),ri(i){}

成员初始化的顺序

  成员的初始化顺序与它们在类定义中出现的顺序一致;构造函数初始化列表中初始值的前后位置关系不会影响实际的初始化顺序。

  

posted @ 2019-09-21 16:42  Silly_Truman1  阅读(227)  评论(0)    收藏  举报