C++ 拷贝构造函数 的学习

拷贝构造函数

       什么是拷贝构造函数?

               只有单个形参,而且该形参是对本类对象的引用。常用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.注意析构函数体内并不是删除对象,而是做一些清理工作,

          调用构造函数与析构函数的顺序:

                 先构造的后析构,后构造的先析构;

(例子下次补充)








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值