关于初始化构造函数列表

来源:互联网 发布:有道词典linux版安装 编辑:程序博客网 时间:2024/05/05 20:22

构造函数初始化列表
构造函数初始化列表示例如下:

Sales_item::Sales_item(const string &book) : isbn(book), units_sold(0), revenue(0)  { }

构造函数初始化列表以冒号开始,以逗号分隔数据成员,每个数据成员后面跟上其初始值,上面的构造函数将isbn成员初始化为book形参的值,将units_sold和revenue初始化为0,构造函数初始化列表只能出现在构造函数定义中而不是声明中。

Sales_item::Sales_item(const string &book){        isbn = book;        units_sold = 0;        revenue = 0.0;}

以上是在构造函数体内对成员变量进行赋值,那么上面两种方法有什么不同呢?
构造函数可以分两个阶段进行:
(1)初始化阶段;
(2)普通计算阶段。
计算阶段也就是由函数体内所有的语句组成。不管成员是否在构造函数初始化列表中显式初始化,类的数据成员初始化总是在初始化阶段进行,初始化阶段先于计算阶段。从这里可以看出,前面两种方式不同之处,构造函数初始化列表是对类的成员做初始化,而在构造函数体内只是对类的数据成员进行了一次赋值操作。

  1. 那么什么时候需要构造函数初始化列表呢?
    (1) const成员
    (2) 引用类型成员
    (3) 没有默认构造函数的类成员
    以上3种情况需要在构造函数初始化列表中对数据成员进行显式初始化。因为const和引用类型成员只能初始化,不能对其进行赋值操作。

  2. 初始化顺序
    构造函数初始化列表只是指定了成员的初始值,并没有指定初始化顺序,那么成员初始化顺序又是怎样的呢?成员的初始化顺序就是定义成员的顺序,第一个定义的成员首先被初始化,然后是第二个等等。

  3. 初始化可以任意的表达式
    初始化可以是任意复杂的表达式,例如:

Sales_item::Sales_item(const string &book){        isbn = book;        units_sold = 0;        revenue = 0.0;}

上述都是通过形参来决定初始值。

  1. 类类型的数据成员的初始化形式
    初始化类类型的成员时,可以使用该类型任意的构造函数。
0 0
原创粉丝点击