构造函数初始化列表
构造函数初始化列表示例如下:
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) const成员
(2) 引用类型成员
(3) 没有默认构造函数的类成员
以上3种情况需要在构造函数初始化列表中对数据成员进行显式初始化。因为const和引用类型成员只能初始化,不能对其进行赋值操作。初始化顺序
构造函数初始化列表只是指定了成员的初始值,并没有指定初始化顺序,那么成员初始化顺序又是怎样的呢?成员的初始化顺序就是定义成员的顺序,第一个定义的成员首先被初始化,然后是第二个等等。初始化可以任意的表达式
初始化可以是任意复杂的表达式,例如:
Sales_item::Sales_item(const string &book)
{
isbn = book;
units_sold = 0;
revenue = 0.0;
}
上述都是通过形参来决定初始值。
- 类类型的数据成员的初始化形式
初始化类类型的成员时,可以使用该类型任意的构造函数。