• C++笔记——关于拷贝构造、拷贝赋值、析构(0)


    其实这一块展开来讲会很长,这里只是大致讲一下相关的定义、作用。都是一些很浅显的内容。

    拷贝构造函数:

    图一

    在图一中,红色箭头所指的函数就是构造函数。构造函数输入类型是自己,那么就是拷贝构造函数。用法类似于:

    String s1;
    s3(s1);    // 这样会调用拷贝构造函数
    

    图一中构造函数下面一行就是拷贝赋值函数。在下面这种情况会调用拷贝复制函数:

    String s2 = s3;
    

    值得注意的是左侧函数名部分,不能够省略掉&,因为这个类有指针。

    与类同名,但是前面带着波浪号~的是析构函数。

    图二

    构造函数和析构函数的定义如图二所示,注意inline,因为这是在类的定义外面写的,所以要注意机上inline定义为内联函数,否则编译器会当作函数处理。图一中的get_c_str就是默认内联函数了,因为在类定义的时候就已经定义了。析构函数里面要注意不能够省略掉delete,不然会导致内存泄露。基本上只要类里面出现了动态分配的指针,就需要注意及时delete

    图三

    图三就是具体用法的例子。

    如果类里面含有动态分配的指针,必须要有拷贝构造函数和拷贝赋值函数。如果没有自己写的拷贝赋值函数,那么就会使用编译器默认分配的函数,例如说上图中b = a,默认的拷贝赋值函数会将类里面的内容原原本本地复制过去,而因为类里面的内容只有指针,因此会导致两个类的指针指向同一个地址;而b原本指向的地方因为没有被销毁,但是又没有指针指向它,导致无法访问,最终就会造成内存泄露。而我们使用的时候理解是复制指针指向的内容,因此默认的拷贝赋值函数并不能够满足我们的需求。题外话,默认拷贝赋值函数这种行为称为“浅拷贝”。

    拷贝构造函数如上图所示,注意这里隐藏的知识点:同一个类下的兄弟互为friend,即可以访问另一个对象的private数据。

    上图是拷贝赋值函数,注意检测,这里的检测一定不能够丢掉,因为这里的思路就是,将左侧的内容给清空,然后重新分配一个和右侧内容相同大小的空间,最后将右侧对象的内容复制到左侧对象(自己)去。上图右侧是使用的例子。

  • 相关阅读:
    Java的栈和队列
    Spring @Scheduled 在tomcat容器里面执行两次
    Java calendar获取月份注意事项
    mysql 查询今天,昨天,上个月sql语句 注解
    MySQL 查询最近几天的记录 最近7天的记录 本周内的记录
    关于mybatis 注解sql sum(参数)传参写法
    tomcat 部署war项目
    maven项目生成war包
    Cron表达式
    ### 获取当前日期的函数
  • 原文地址:https://www.cnblogs.com/yejianying/p/cpp_notes_copy_ctor_copy_assign_destroy_0.html
Copyright © 2020-2023  润新知