拷贝构造函数、析构函数

蔚落 2022-06-06 03:48 422阅读 0赞

一、拷贝构造函数

(一)、何为拷贝?

拷贝一词来源于英文中的copy,译为:抄写,复制,复制品。将原有物件,按照同样式的在来一份。

**举个栗子:

饭点到了,和朋友一起去吃饭。
我兴高采烈地跟老板说:“老板,来碗饺子”。
(别问我为什么是饺子,如果一定想知道,好吧,我承认我对饺子爱的深沉)
这个时候,老板说“要得,稍等!”。
又转问我朋友吃啥。
不料他也说:“饺子一碗”!
“你这人,不是拷贝我嘛!!!”

好了,说到这儿,你大概知道拷贝是什么意思了,那么,我们就趁热打铁。

(二)、拷贝构造函数

前面我们介绍了构造函数,详情见
http://blog.csdn.net/dai_wen/article/details/78328965,那么, 这里的拷贝构造函数是不是跟它有血缘关系呢?下面,就来探个究竟。

1.定义:

首先, 拷贝构造函数是函数,它是特殊的构造函数。仅有一个形参,该形参是本类类型对象的引用,创建对象时,使用已存在的同类对象对自身进行初始化,又编译器自动调用。

A:

  1. CDate (const CDate& date,const CDate& time)
  2. {
  3. }
  4. //在该函数中有两个形参,故而断定它不是拷贝构造函数

B:

  1. CDate (const CDate date)
  2. {
  3. }
  4. //在该函数中,形参部分不是类类型的引用,故而断定它不是拷贝构造函数

2.举个栗子:

  1. class Date
  2. {
  3. public:
  4. //构造函数
  5. Date(const int year ,const int month,const int day )
  6. {
  7. _iyear=year;
  8. _imonth=month;
  9. _iday=day;
  10. }
  11. //拷贝构造函数
  12. Date(const Date& date)
  13. {
  14. _iyear=date._iyear;
  15. _imonth=date._imonth;
  16. _iday=date._iday;
  17. }
  18. private:
  19. int _iyeay;
  20. int _imonth;
  21. int _iday;
  22. };
  23. void FunTest(Date& date)
  24. {
  25. return date;
  26. }
  27. int main()
  28. {
  29. Date d1(2017,10,23);
  30. FunTest(d1);
  31. Date d2(1995,08,15);
  32. d2=FunTest(d1);
  33. return 0;
  34. }

在该程序中, 显然,d2是d1的一份拷贝。

3. 由此看透:

(i)拷贝构造函数是构造函数的重载
(ii)形参类型必须是相同类的构造函数的引用
(iii)若没有显式定义,系统会自动合成默认的拷贝构造函数,它会依次拷贝类的数据成员完成初始化。

4.使用场景:

(1)、对象实力化对象。

  1. Date d1(2017,10,23);
  2. Date d2(d1);

(2)、传值方式作为函数的参数

  1. void FunTest(const CDate date)

(3)、传值方式作为函数的返回值

  1. CDate FunTest()
  2. {
  3. CDate date;
  4. return date;
  5. }

5. 打倒面试题:


思考题1:为什么形参必须引用?不传引用可以吗?

解析:答案是肯定不可以的 。

  1. Date d1(2017,10,29);
  2. Date d2(d1);

如果不传引用,仅采用传值的方式,那么,当程序运行到Date d2(d1)时,将无限重复执行该语句,形成无限递归,程序无法正常实现功能。

二、析构函数:

(一)、定义:

析构函数与构造函数的功能恰好相反。在对象被销毁时,由编译器自动调用,完成类的一些“清理”和汕尾工作。

(二)、形式:~函数名()

(三)举个栗子:

  1. class CArray
  2. {
  3. public:
  4. CArray(size_t capacity)
  5. :_capacity(capacity)
  6. {
  7. _PData=(int *)malloc(capacity* sizeof(int));
  8. _size=0;
  9. }
  10. ~CArray()//析构函数
  11. {
  12. if(NULL!=_PData);
  13. {
  14. free(_PData);//
  15. _PData=NULL;//清理、释放内存
  16. }
  17. _size=0;
  18. _capacity=0;
  19. }
  20. private:
  21. int * _PData;
  22. size_t_size;
  23. size_t_capacity;
  24. };

(四)、析构函数特性:

1、析构函数在函数名前加一个~;

2、没有任何参数

3、没有返回值

4、一个类中只有一个构造函数

5、在对象生命周期结束时,C++ 编译器自动调用析构函数

6、析构函数本质上并不是删除对象,而是做一些清理工作。

三、有奖竞答:

  1. 留个栗子给大家剥:
  2. 思考题:既然编译器会自动合成拷贝构造函数,那么,它还有没有给出的必要? 什么情况下必须给出?

发表评论

表情:
评论列表 (有 0 条评论,422人围观)

还没有评论,来说两句吧...

相关阅读

    相关 构造函数函数

    构造函数      先看看构造函数的调用顺序规则,只要我们在平时编程的时候遵守这种约定,任何关于构造函数的调用问题都能解决;构造函数的调用顺序总是如下: 1.基类构

    相关 构造函数函数

    构造函数      先看看构造函数的调用顺序规则,只要我们在平时编程的时候遵守这种约定,任何关于构造函数的调用问题都能解决;构造函数的调用顺序总是如下: 1.基类构

    相关 拷贝构造函数函数

    一、拷贝构造函数 (一)、何为拷贝? 拷贝一词来源于英文中的copy,译为:抄写,复制,复制品。将原有物件,按照同样式的在来一份。 \\举个栗子: 饭点到了,和