拷贝构造函数
什么是拷贝构造函数?
只有单个形参,而且该形参是对本类对象的引用。常用const修饰,这样的构造函数称为拷贝构造函数。
拷贝构造函数的特征:
1.它是构造函数的重载;
2.它的参数必须使用同类型对象的引用传递;(原因:如果是以值的形式传递的话,在传参的过程中创建了 临时变量,并调用拷贝构造函数,又进行传参,创建临时变量,调用拷贝构造函数,则无限调用拷贝构造 函数,造成无限递归)
3.如果没有显示的定义,系统会自动的合成一个默认的拷贝构造函数。
由特征衍生出的问题:
问题一:出现语句Date d2(d1);编译器一定会合成拷贝构造函数吗?
答:不一定,与构造函数相同,编译器会根据是否需要合成来决定,并且一定会合成的情况与构造 函数相同。
问题二:如果默认构造函数合成,那他做了什么事情?
答:创建了新的类对象,但不进行初始化。
问题三:如果没有合成,则新的类对象的值是什么?
答:乱码
class Time
{
public:
Time(int hour = 4,int minute=1,int second = 1)
:_hour(hour)
,_minute(minute)
,_second(second)
{}
Time(const Time &t)
{
_hour =t._hour;
_minute = t._minute;
_second = t._second;
}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
public:
private:
int _year;
int _month;
int _day;
Time t1;
};
int main()
{
Date d1;
Date d2(d1);
return 0;
}
以上是合成默认构造函数的例子。
复制构造函数调用的一般形式:
类名 对象名(const 类名 &变量名);
或
类名 对象名 1=对象名2;
构造函数和拷贝构造函数在什么情况下使用:
普通构造函数在程序中建立对象时被调用;
拷贝构造函数在用已有的对象复制一个新的对象时被调用,以下三种情况:
1.程序中需要新建立一个对象,并用同一类对象对它进行赋值;
Date d1(1990, 1, 1);
Date d2(d1);
2.当函数参数为类对象时;(需要创建实参的临时对象,调用拷贝构造函数)
void FunTest(const CDate date)
{}
3.当函数返回值是类对象时;(以值的形式返回,出现一个临时副本,调用拷贝构造函数)
CDate FunTest()
{
CDate date;
return date;
}
析构函数
什么是析构函数?
与构造函数功能相反,在对象被销毁时,由编译器自动调用,完成类的一些资源清理的汕尾工作。
构造函数的特征:
1.析构函数名是在类名上加字符~;
2.析构函数无参数无反回值;
3.一个类有且只有一个析构函数,若无显示定义,系统会自动生成缺省的析构函数;
4.对象的生命周期结束时,C++编译系统会自动调用析构函数;
5.注意析构函数体内并不是删除对象,而是做一些清理工作,
调用构造函数与析构函数的顺序:
先构造的后析构,后构造的先析构;
(例子下次补充)