• 从零开始的C++(四)


    上篇链接:http://t.csdnimg.cn/3nyT9

    1.拷贝构造函数

    上篇中介绍了析构函数,即在对象销毁时自动调用的函数,常用于含有malloc、fopen等成员变量的对象。然而,在将对象做函数实参进行值传递的时候,可能会因为析构函数引发一些错误,实例如下:

    1. class stack
    2. {
    3. public:
    4. stack(int n=16)
    5. {
    6. //开辟空间
    7. if (n == 0)
    8. {
    9. _arry = nullptr;
    10. }
    11. else
    12. {
    13. _arry = (int*)malloc(sizeof(int) * n);
    14. _size = 0;
    15. _capacity = n;
    16. }
    17. }
    18. ~stack()
    19. {
    20. //销毁空间
    21. free(_arry);
    22. _size = _capacity = 0;
    23. }
    24. int* _arry;
    25. int _size;
    26. int _capacity;
    27. };
    28. int GetSNum(stack s)
    29. {
    30. return s._size;
    31. }
    32. int main()
    33. {
    34. stack s1;
    35. GetSNum(s1);
    36. }

    上述代码只是创造了一个stack类的对象,然后用值传递的方式求对象的一个成员变量,但却报错了,原因便是析构函数。值传递到形参后,形参的_arry变量和实参的_arry变量存放的内容一样,均是s1构造函数开辟的那份空间,而形参在函数结束后销毁,进行一次析构函数调用,而实参在main函数结束后也销毁,进行一次析构函数调用,两次析构调用free了同一份空间,因此产生了报错。那么这种现象该如何避免,方法一就是形参采用引用的方式,因为引用是取一份别名,因此函数调用完后不会销毁,析构函数也不会调用,就不会出现free两次的情况了。方法二就是重写拷贝构造函数(通过重写拷贝构造使得形参的_arry开辟一块新的空间)。

    拷贝构造函数是默认成员函数的其中之一,即不写的话编译器会调用默认拷贝构造函数。其的特点是只有一个参数,是同类型对象的引用。(注:必须是引用不能是值,不然会出现无限拷贝的情况)。同时,为了防止引用的对象的值被修改,常用const修饰。一般来说,自定义类型需要进行值传递的话,必须重写拷贝构造函数。

    拷贝构造函数的调用方式有两种:

    1.类名+对象名(对象);

    2类名+对象名=对象;

    两种方法的结果相同,可以任选一种使用。

    默认拷贝构造函数:

    1.成员是内置类型会进行值传递,成员是自定义类型会调用其拷贝构造函数。

    2.拷贝构造函数重写常是有malloc、fopen的成员变量。

    2.运算符重载:

    运算符重载的本质是函数,用于对自定义类型的对象进行运算。

    写法:返回类型+operator+运算符+()。

    特点:

    1.不能创造新的运算符。

    2.至少要有一个参数是自定义类型。(防止重载后的运算符和原有的运算符算法产生冲突,如重载两个整形的加法为减法,就会和原本加法产生冲突,因此不行)。

    3.不能修改运算符对应的操作数的个数(如加法操作数是两个,不能重载成别的个数)。

    4.":: " ,"sizeof”     ,       " ."      ,       “ *. ”不能重载。

    5.运算符可以作为成员函数,此时形参内的参数要比实际的参数少一个,因为有一个是隐含的this指针。此时的调用方式有 对象名 操作符 对象名、对象名.operator操作符(对象名)。

    本篇讲述了拷贝构造函数,初步了解了运算符重载

  • 相关阅读:
    HDMI字符显示实验
    【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据
    普冉PY32系列(十二) 基于PY32F002A的6+1通道遥控小车III - 驱动篇
    吃透BGP,永远绕不开这些基础概述,看完再也不怕BGP了!
    Linux C语言无名信号量与有名信号量(无名使用 <semaphore.h>,有名信号量<sys/sem.h>)
    密码学奇妙之旅、01 CFB密文反馈模式、AES标准、Golang代码
    Python界面编辑器Tkinter布局助手 使用体验
    [PAT-Advanced] B1020/A1070. Mooncake (25)
    VASA-1:实时音频驱动的数字人说话面部视频生成技术
    day53:day6,人脸识别
  • 原文地址:https://blog.csdn.net/yyssas/article/details/133528184