转自: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){}
这就可以简化构造函数的重载的代码,实现代码复用