初始化列表-GCC 4.9编译通过

如下图所示,在冒号和花括号之间的代码部分称为构造函数的初始值列表,它的作用是给创建的对象的某些成员赋初值。这种是在构建对象的时候的初始化,是在对象创建成功之前完成的,和在函数体内赋值是不一样的,函数体内赋值是你的对象成员都已经创建好后对成员进行的赋值。

Date(int year=1990,int month=1,int day=1)
        :_year(year), _month(month), _day(day)
 {}
 那么,可以看到,这种初始化并不是必须的。但是在以下几种情况时是必须进行初始化的:

 1. 成员是const类型。 
 2. 成员是引用类型。 
 3. 有一个成员是类类型的对象(且它没有缺省的构造函数)
#include <iostream>
using namespace std;
class Time
{
public:
    Time(int hour) 
    {
        _hour = hour;
    }
 
private:
    int _hour;
};
class Date
{
public:
    Date(int year=1990,int month=1,int day=1)
        :_year(year), _month(month), _day(day), t(10)
    { }
    void print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
private:
    int _year=1990;
    int _month;
    int _day;
    Time t;
};

解释:

 1. 对于const和引用类型,必须要进行初始化,所以他们必须在初始化列表中进行初始化。
 2. 当类类型成员有缺省的构造函数时,在创建对象的时候体统会默认调用,因为不用传参。
 当你的构造函数不是缺省的,如果不在初始化列表中进行调用构造函数,系统就无法知道
 怎么调用t的构造函数,那么就无法创建t了。

  如上代码中,需要在参数列表中调用t的构造函数才不会出错。

成员初始化顺序:
在上面的初始列表中,每个成员只能出现一次,因为一个变量多次初始化是无意义的。
还有重要的一点,初始化列表的顺序并不限定初始化的执行顺序。成员的初始化
顺序是与类中定义的顺序保持一致。可以看看下面的初始化列表:

Date(int year=1990,int month=1,int day=1)
    :_year(year), _month(month), _day(day), t(10)
{}

在这里的意思是想要用1来初始化_month,再用_month初始化_year。但其实是_year被先初始化,而此时你的_month并没有初始化,所以,最后的结果是_year是一个随机值。

 所以,最好让构造函数初始值的顺序与成员声明的顺序保持一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值