默认成员函数:析构、深浅拷贝

析构函数

析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。

特性

  1. 析构函数名时在类名前面加上字符~
class Date
{
public:Date(int year, int month , int day){_year = year;_month = month;_day = day;}~Date(){......}private:int _year = 0;int _month = 0;int _day = 0;
}
  1. 无参数无返回值类型,不带void

  2. 一个类只能由一个析构函数,如果未显式定义,系统会自动生成默认的析构函数。

  3. 析构函数不支持重载。

  4. 对象声明周期结束时,C++编译系统自动调用析构函数。

  5. 编译器生成的默认析构函数,对自定义类型成员调用它的析构函数。对内置类型不做处理。

  6. 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数。有资源申请时,一定要写,否则会造成资源泄露。

    对象的栈帧的开辟和销毁都是由编译器进行的。不需要析构
    动态开辟的空间资源才需要析构。

拷贝构造

拷贝构造函数:只有单个形参,该形参试对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。

特征

  • 浅拷贝:值拷贝
  • 深拷贝:深拷贝本质拷贝指向的资源,让两个被拷贝和拷贝者都有一样大的空间,一样大的值,但不是同一个空间。
  1. 拷贝构造函数是构造函数的一个重载形式

  2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。

  3. 若未显式定义,编译器会生成默认的拷贝构造函数。默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。

  4. 编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝,还需要自己显实现吗?如果像日期类这种类没有必要的,但是如果是别的需要开辟空间的呢?

    创建一个stack的对象s1,s1调用构造函数,申请了一个空间。s2使用s1拷贝构造,而Stack中没有显式定义的拷贝构造函数,此时编译器默认生成了一个拷贝构造函数,默认的拷贝构造函数是按照值拷贝的方式进行拷贝的,即将s1中的成员变量存储的值原封不动的赋值给了s2中的成员变量,拷贝结束之后,s2中的成员变量指向了和s1成员变量指向的同一片空间。
    当程序结束的时候,s2先销毁,s1后销毁,s2先调用析构函数对这片申请的空间进行了析构,然后s1销毁,此时s1并不知道这片内存空间已经销毁了,再次对这片空间进行了析构,此时就会崩溃。对一片内存空间进行了多次释放。

浅拷贝

  • 类中如果没有设计资源申请时,拷贝构造函数是否写都可以;
  • 一旦涉及到资源申请,则拷贝构造函数是一定要写的,否则就是浅拷贝。
  1. 拷贝构造的典型调用场景:
    • 使用已存在的对象创建对象
    • 函数参数类型未类类型对象
    • 函数返回值类型为类类型对象
  • 为了提高程序效率,一般对象传参时,尽量使用引用类型,返回时根据实际场景,能用引用尽量使用引用。

  • 拷贝构造主要用于解决深拷贝的问题。

  • 深拷贝本质拷贝指向的资源,让两个被拷贝和拷贝者都有一样大的空间,一样大的值,但不是同一个空间。

深拷贝

//Stack st2(st1);
Stack(const Stack& st)
{_a = (int*)malloc(sizeof(int) * st._capacity);if(_a == nullptr){perror("malloc fail");exit(-1);}memcpy(_a,st._a,sizeof(int)*st._top);_top = st._top;_capacity = st._capacity;
}
  • 两个已经存在的对象拷贝,赋值拷贝
  • 一个已经存在的对象拷贝初始化另一个要创建的对象,就是拷贝构造
A aa1(1);A aa2(aa1);    //拷贝构造
A aa3 = aa1;   //拷贝构造aa2 = aa3;    //赋值拷贝

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/701528.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微命令】git config如何配置全局的用户和邮箱?(--global user.name、user.email;git config --help)

虽然经常用,也经常忘记,特此记录。 命令 git config --global user.name "myname" git config --global user.email test163.com另外一种方式 help git config --help |grep email | grep name直接help查看

ICode国际青少年编程竞赛- Python-5级训练场-多参数函数

ICode国际青少年编程竞赛- Python-5级训练场-多参数函数 1、 def go(a, b):Spaceship.step(2)Dev.step(a)Spaceship.step(b)Dev.turnRight()Dev.step(b)Dev.turnLeft()Dev.step(-a) Dev.turnLeft() Dev.step(3) Dev.step(-3) go(3, 2) go(6, 1) go(5, 2) go(4, 3)2、 def go(…

【已解决】力扣打不开

表现: 1.访问国内其他网站都没有问题 2.访问github也能成功 3.wifi没有问题 4.连接同网络的其他主机能打开 唯独力扣打不开,可能是DNS解析错误 》自己网络配置问题 解决办法【亲测可行】 找可用的hosts 打开站长之家,进行DNS查询&#xff…

树莓派|串口通信协议

1、串口通信原理 串口通讯(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。串…

C++基础与深度解析 | 表达式 | 操作符

文章目录 一、表达式基础1.表达式的值类别2.表达式的类型转换 二、表达式详述1.算术操作符2.逻辑与关系操作符3.位操作符4.赋值操作符5.自增与自减运算符6.其他操作符三、C17对表达式的求值顺序的限定 一、表达式基础 表达式由一到多个操作数组成,可以求值并 ( 通常…

CKA-Ubuntu18.04安装Kubernetes集群

文档整理参考:虫之教育唐老师 文章目录 K8S是什么修改静态ip环境准备修改更新源安装Docker安装K8S-master1.安装kubeadm, kubelet, kubectl2.初始化3.创建kubeadm-config.yaml4.查看是否安装成功运行集群环境报错排查问题安装网络安装K8S-node1,2步参考master3.查看是否安装成…

用Swagger(工具Knife4j )代替postman来进行构建、测试和调试 API

什么是Swagger? Swagger 是一个用于设计、构建和文档化 RESTful Web 服务的开源框架。它允许开发者设计 API,然后生成对应的 API 文档,提供给团队成员或者第三方开发者查阅。Swagger 的核心是 OpenAPI 规范(之前称为 Swagger 规范…

SpringBoot集成Curator实现Zookeeper基本操作

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Zookeeper是一个Ap…

python数据分析——seaborn绘图2

参考资料:活用pandas库 # 导入库 import pandas as pd import matplotlib.pyplot as plt import seaborn as sns tipspd.read_csv(r"...\seaborn常用数据案例\tips.csv") print(tips.head()) 1、成对关系表示 当数据大部分是数据时,可以使用…

群辉部署小雅alist实现视听盛会

最近群辉搭建起来了,开始整蛊影视库,之前搞过nastool。这次折腾下小雅alist。 1.下载并安装 直接在群辉的docker里面下载映像 主要映射下端口和文件夹 #token mytoken.txt 获取地址:https://alist.nn.ci/zh/guide/drivers/aliyundriv…

在Windows环境下安装CPU版的PyTorch

PytTorch是基于Python开发的,首先需要安装Python,Python的安装很简单,这里不再赘述。而 Windows用户能直接通过conda、pip和源码编译三种方式来安装PyTorch。 打开PyTorch官网(PyTorch),在主页中根据自己的…

安卓AsyncTask使用

目录 一、简介1.1 AsyncTask 参数简介1.2 常用方法1.3 执行顺序1.4 使用注意1.5 使用步骤 二、使用示例三、应用场景 一、简介 public abstract class AsyncTask<Params, Progress, Result> {1.1 AsyncTask 参数简介 Params&#xff1a;开始异步任务执行时传入的参数类型…