您的位置:首页 > 其它

关于初始化构造函数列表

2016-07-14 15:58 155 查看
构造函数初始化列表

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

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;
}


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

类类型的数据成员的初始化形式

初始化类类型的成员时,可以使用该类型任意的构造函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: