C++中为什么建议使用初始化列表

什么是初始化列表,来看下面代码,我们有一个日期类对象
我们可以这样来定义构造函数:

class Date                                                                                                                                                   
{                                                                                                                                                            
  public:                                                                                                                                                    
    Date(int year,int month,int day)                                                                                                                         
    {                                                                                                                                                        
      _year = year;                                                                                                                                          
      _month = month;                                                                                                                                        
      _day = day;                                                                                                                                            
    }                                                                                                                                                        
  protected:                                                                                                                                                 
    int _year;                                                                                                                                               
    int _month;                                                                                                                                              
    int _day;                                                                                                                                                
};         

也可以利用初始化列表:

class Date                                                                                                                                                   
{                                                                                                                                                            
  public:                                                                                                                                                    
    Date(int year,int month,int day)                                                                                                                         
      :_year(year),_month(month),_day(day)  //使用初始话列表初始化成员变量                                                                                                                 
    {                                                                                                                                                                                                                                                                                                                                                                                                              
    }                                                                                                                                                        
  protected:                                                                                                                                                 
    int _year;                                                                                                                                               
    int _month;                                                                                                                                              
    int _day;                                                                                                                                                
};         

如上两种方法来定义构造函数,一种是在构造函数体内对成员变量进行初始化,一种是使用构造函数来初始化成员变量,都可以达到初始化成员变量的效果,两者有什么区别呢?
在对于内置类型而言,我们还看不出效果
假如有如下需求,我们需要将日期类拓展为时间单位更精确。

//定义一个时间类
class Time
{
  public:
    Time(int hour = 0,int minute = 0,int second = 0)
    {//定义一个全缺省构造函数
      _hour = hour;
      _minute = minute;
      _second = second;
      cout<<"Time();"<<endl;
    }
  protected:
    int _hour;
    int _minute;
    int _second;
};


class Date
{
  public:
    Date(int year,int month,int day,int hour,int minute,int second)
    {
      _year = year;
      _month = month;
      _day = day;
      _time = Time(hour,minute,second);
    }
  protected:
    int _year;
    int _month;
    int _day;
    Time _time;//时间类作为日期类的成员变量
};

这里写图片描述

猜你喜欢

转载自blog.csdn.net/misszhoudandan/article/details/80932717