C++构造函数初始化列表 委托构造函数

转自:https://blog.csdn.net/ms347397173/article/details/50075665
(一)构造函数允许使用构造函数初始值列表,来为变量初始化 适用于成员变量有构造函数的任何情况

代码示例:


#include<iostream>
using namespace std;
 
class Date 
{
public:
     //构造函数初始化列表
     Date(int y, int m, int d) :_year(y), _month(m), _day(d){}
     //默认1970年1月1日  委托构造函数
     Date() :Date(1970, 1, 1){}
     //只给年初始化 月、日都为1  委托构造函数
     Date(int y) :Date(y,1,1){}
     //拷贝构造函数
     Date(const Date & d) :_year(d._year),_month(d._month),_day(d._day){}
     void Display()
     {
          cout << _year << "年" << _month << "月" << _day << "日" << endl;
     }
     ~Date()
     {
          cout << "析构函数!" << endl;
     }
     /*bool operator==(const Date& d)
     {
          return this->_year == d._year&&this->_month == d._month&&this->_day == d._day;
     }*/
     friend bool operator==(const Date &d1, const Date &d2);
    
private:
     int _year;
     int _month;
     int _day;
};
 
bool operator==(const Date &d1, const Date &d2)
{
     return (d1._year == d2._year) && (d1._month == d2._month) && (d1._day == d2._day);
}
 
int main()
{
     Date d1(2015);
     Date d2(d1);
     Date d3(2016);
     bool b = (d1 == d2);
     cout << b << endl;
     d1.Display();
     d2.Display();
     system("pause");
     return 0;
}

构造函数初始化列表:
作用:在变量分配空间(定义)时为其赋值 也就是所谓的初始化
而在构造函数中使用“=”则是对成员变量赋值 也就是说 构造函数初始化列表是真正的初始化,而在构造函数中构造的话成员变量已经定义了,只能算作赋值
如:Date(int y,int m,int d){_year=m;_month=m;_day=d;} //变量为赋值 而不是初始化

而 : Date(int y, int m, int d) :_year(y), _month(m), _day(d){} //使用了构造函数初始化列表是初始化不是赋值

那么,实际上上述两种方法功能相同,有什么区别呢?
上述方法功能却是相同,但是在某些特殊情况下则只能用构造函数初始化列表
举例:

class Date
{
public:
     //构造函数
     //Date(int y, int m, int d) :_year(y), _month(m), _day(d){}
     Date(int y, int m, int d)
     {
          _year = y;
          _month = m;
          _day = d;
     }
private:
     int _year;
     int _month;
     int _day;
};

对于这样的成员变量来说,两种方法都可以。
但是,对于下面的代码,就有所不同了

class Date
{
public:
     //构造函数
     Date(int y, int m, int d) :_year(y), _month(m), _day(d){}
     //Date(int y, int m, int d)
     {
          _year = y;
          _month = m;
          _day = d;
     }
private:
     const int _year;
     const int _month;
     const int _day;
};

这个时候,使用构造函数初始化列表是对的,可以编译。而带参的构造函数缺直接编译报错,原因很简单,不能对一个const对象赋值,const对象只能初始化,所以两者的区别就出来了,构造函数初始化列表是真正的初始化一个成员变量。同时,初始化和赋值的含义也是不同的。

同时,说一下初始化和赋值的不同。
初始化:给变量分配内存时就给定的值,也就是说赋值发生在内存分配之时。
赋值:变量的内存已经分配,再根据寻址向该内存区域写入值。
区别点就在于两者赋值的时机,也导致了类似与const变量这种场景下只能初始化的情

(二)委托构造函数:
C++11允许使用委托构造函数来复用代码

具体代码:

#include<iostream>
using namespace std;
 
class Date 
{
public:
     //构造函数初始化列表
     Date(int y, int m, int d) :_year(y), _month(m), _day(d){}
     //默认1970年1月1日  委托构造函数
     Date() :Date(1970, 1, 1){}
     //只给年初始化 月、日都为1  委托构造函数
     Date(int y) :Date(y,1,1){}
     //拷贝构造函数
     Date(const Date & d) :_year(d._year),_month(d._month),_day(d._day){}
     void Display()
     {
          cout << _year << "年" << _month << "月" << _day << "日" << endl;
     }
     ~Date()
     {
          cout << "析构函数!" << endl;
     }
     /*bool operator==(const Date& d)
     {
          return this->_year == d._year&&this->_month == d._month&&this->_day == d._day;
     }*/
     friend bool operator==(const Date &d1, const Date &d2);
    
private:
     int _year;
     int _month;
     int _day;
};
 
bool operator==(const Date &d1, const Date &d2)
{
     return (d1._year == d2._year) && (d1._month == d2._month) && (d1._day == d2._day);
}
 
int main()
{
     Date d1(2015);
     Date d2(d1);
     Date d3(2016);
     bool b = (d1 == d2);
     cout << b << endl;
     d1.Display();
     d2.Display();
     system("pause");
     return 0;
}

其中:Date()、Date(int y)两个函数都委托Date(int y,int m,int d)这个构造函数,这个函数在构造函数初始化列表中被调用。


</pre><pre name="code" class="cpp">     //构造函数初始化列表
     Date(int y, int m, int d) :_year(y), _month(m), _day(d){}
     //默认1970年1月1日  委托构造函数
     Date() :Date(1970, 1, 1){}
     //只给年初始化 月、日都为1  委托构造函数
     Date(int y) :Date(y,1,1){}

这就可以简化构造函数的重载的代码,实现代码复用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值