构造函数初始化列表

一、什么是构造函数初始化列表

构造函数初始化列表,是在构造函数的基础上,后面以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:

  class A
  {
  public:
      int a;
      int b;
      //一般的构造函数
      A(int x, int y)
      {
          a = x;
          b = y;
      }
  };
class A
  {
  public:
      int a;
      int b;
      //构造函数初始化列表
      A(int x, int y):a(x),b(y)
      {/*空函数体*/}
  };

一般的构造函数和构造函数初始化列表有什么区别?

1、这两个构造函数实现的效果是一样的,都可以实现类内成员变量的初始化

2、构造函数初始化列表的使用面更广,有些类型数据(const、引用)的初始化操作使用一般的构造函数初始化不了。

注意:static静态局部变量的初始化不能在参数列表中进行,只能在构造函数内进行

下面会重点举这方面的例子

1、类内没有默认构造函数的成员类对象;(构造函数不带参数,即如果类里面的类对象需要初始化,一般的构造函数初始化不了

 

 正确的做法是使用构造函数参数列表,列表里面对类对象进行初始化赋值

2、类内const成员或引用类型的成员。(const全局静态变量只能在初始化的时候赋值,其它时候赋值不了)

错误的方法

正确使用方法

还有重要的一点是,使用构造函数初始化列表比一般的构造函数效率高,初始化列表会把初始化和赋值放在一起进行,只需要拷贝构造一次,而一般的构造函数需要拷贝构造两次

使用构造函数初始化列表

使用一般构造函数

二、构造函数初始化列表 的顺序问题

 最后在总结一下

1、一般的构造函数不能初始化自带构造函数的类对象

2、一般的构造函数不能初始化const变量和引用变量

3、static变量不能使用列表参数去初始化

4、使用列表参数初始化类内成员变量的效率会更高

5、使用列表参数的时候,声明类内变量的前后顺序很重要,在进行初始化的时候,要避免用一个未初始化的参数去初始化另一个参数

 

原文地址:https://www.cnblogs.com/-citywall123/p/12902899.html