析构函数和拷贝构造函数

文章目录

  • 析构函数
    • 1.析构函数的定义:
    • 2.析构函数的语法:
    • 3.析构函数的特性:
  • 拷贝构造函数
    • 1.拷贝构造函数的定义:
    • 2.拷贝构造函数的语法
    • 3.拷贝构造函数的特性
      • (1)拷贝构造函数是构造函数的一个重载形式**(这个其实也很好理解,由于构造函数实现的是对对象的初始化,而拷贝构造也是对对象的初始化,只不过需要把值进行拷贝,然后实现初始化,所以它们的功能是相似的,但它们的参数不同,所以它们构成函数的重载)**
      • (2)拷贝构造参数只能有一个,并且这个参数只能是类的类型对象的引用,用传值的方式,编译器会直接报错,因为传值调用会引发拷贝构造函数的无穷递归。
      • (3)如果没有自定义一拷贝构造函数编译器会自动生成一个默认的拷贝构造函数
      • (4)浅拷贝和深拷贝
  • 总结:

析构函数

1.析构函数的定义:

析构函数是为了完成清理工作的,但不是对对象本身的清理,局部对象的清理是由编译器自动完成的,析构函数是对对象中的资源的清理。

2.析构函数的语法:

~+类名()

class Stack
{
public://析构函数不需要传参过来,因为会有this指针传过来~Stack()//析构函数:~+类名(){free(_a);_a = nullptr;_size = _capacity = 0;}private:int* _a;size_t _size;size_t _capacity;
};

3.析构函数的特性:

(1)析构函数无参数无返回值
(2)一个类只有一个析构函数,若没有自定义析构函数,那么编译器会自动生成析构函数,注意:析构函数是不能重载的。(这个为挺好理解的,如果你有多个函数都能实现清理的功能,由于析构函数是编译器自动调用的,那么编译器就不知道要调用那个函数来清理对象所占的资源了)
(3)对象的生命周期结束时,编译器自动调用析构函数。
(4)编译器自动生成的析构函数,对自定义成员变量会去调用它的析构函数, 但编译器自动生成的构造函数和析构函数不会去初始化和清理内置类型/基本类型(int/char)

下面的代码如果输出~Time()这个字符串,就表示编译器自动生成的析构函数会去调用自定义类型的析构函数

class Time
{
public:~Time(){cout << "~Time()" << endl;}
private:int _hour;int _minute;int _second;
};
class Date
{
private:// 基本类型(内置类型)int _year = 1970;int _month = 1;int _day = 1;// 自定义类型Time _t;
};
int main()
{Date d;return 0;
}

在这里插入图片描述

拷贝构造函数

1.拷贝构造函数的定义:

拷贝构造,顾名思义就是对一个对象的拷贝呗。

2.拷贝构造函数的语法

类名+(参数)

Date(const Date& d)
{//防止下面赋值操作写错,给d去掉可修改的权限_year = d._year;_month = d._month;_day = d._day;
}

3.拷贝构造函数的特性

(1)拷贝构造函数是构造函数的一个重载形式**(这个其实也很好理解,由于构造函数实现的是对对象的初始化,而拷贝构造也是对对象的初始化,只不过需要把值进行拷贝,然后实现初始化,所以它们的功能是相似的,但它们的参数不同,所以它们构成函数的重载)**

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

在这里插入图片描述

(3)如果没有自定义一拷贝构造函数编译器会自动生成一个默认的拷贝构造函数

(4)浅拷贝和深拷贝

下面来判断一段代码,看看这个代码能否正常运行

typedef int DataType;
class Stack
{
public:Stack(size_t capacity = 10){_array = (DataType*)malloc(capacity * sizeof(DataType));if (nullptr == _array){perror("malloc申请空间失败");return;}_size = 0;_capacity = capacity;}void Push(const DataType& data){// CheckCapacity();_array[_size] = data;_size++;}~Stack(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}
private:DataType* _array;size_t _size;size_t _capacity;
};
int main()
{Stack s1;s1.Push(1);s1.Push(2);s1.Push(3);s1.Push(4);Stack s2(s1);return 0;
}

在这里插入图片描述
代码直接崩了,这是因为什么呢?容我慢慢道来
在这里插入图片描述
注意:当类没有涉及空间资源的开辟时,构造函数可自己写也可不写,一旦涉及资源的开辟时,构造函数必须自己写,防止出现浅拷贝问题。

总结:

今天总结了析构函数和拷贝构造函数。

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

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

相关文章

鸿蒙开发设备管理:【@ohos.thermal (热管理)】

热管理 该模块提供热管理相关的接口&#xff0c;包括热档位查询及注册回调等功能。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shi…

如何实现图片垂直旋转90度的问题

非常简单的问题&#xff0c;一串代码就可以解决。复制修改一下就可以直接使用&#xff0c;一个简单的小demo。写项目的时候需要写的功能&#xff0c;不到二十行代码就可以实现。 <html> <head><title>旋转图片</title><meta http-equiv"Conte…

Land survey boundary report (template)

Land survey boundary report (template) 土地勘测定界报告&#xff08;模板&#xff09;.doc

【高校科研前沿】南京地理与湖泊研究所博士后夏凡为第一作者在环境科学与水资源领域Top期刊发文:钙对云南洱海溶解有机质与浮游细菌相互作用的调控作用

文章简介 论文名称&#xff1a;Calcium regulates the interactions between dissolved organic matter and planktonic bacteria in Erhai Lake, Yunnan Province, China 第一作者及单位&#xff1a;夏凡&#xff08;博士后|中国科学院南京地理与湖泊研究所&#xff09; 通讯…

Git指令

一 参考&#xff1a;https://zhuanlan.zhihu.com/p/389814854 1.clone远程仓库 git clone https://git.xiaojukeji.com/falcon-mg/dagger.git 2.增加当前子目录下所有更改过的文件至index git add . 3.提交并备注‘xxx’ git commit -m ‘xxx’ 4.显示本地分支 git branch 5.显…

【pytorch13】激活函数及梯度

什么是激活函数 计算机科学家借鉴生物的神经元机制发明了计算机上的模型&#xff0c;这个模型与生物的神经元非常类似 激活的意思就是z变量要大于0&#xff0c;这一个节点才会激活&#xff0c;否则就会处于睡眠状态不会输出电平值 该激活函数在z0处不可导&#xff0c;因此不能…

Asp .Net Core 系列:基于 Castle DynamicProxy + Autofac 实践 AOP 以及实现事务、用户填充功能

文章目录 什么是 AOP &#xff1f;.Net Core 中 有哪些 AOP 框架&#xff1f;基于 Castle DynamicProxy 实现 AOPIOC中使用 Castle DynamicProxy实现事务管理实现用户自动填充 什么是 AOP &#xff1f; AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&a…

OpenCV——把YOLO格式的图片目标截图,并按目标类别保存

import os import cv2def get_class_folder(catagetory,class_id, base_folder):# 根据类别ID创建文件夹路径class_folder os.path.join(base_folder, catagetory[int(class_id)])if not os.path.exists(class_folder):os.makedirs(class_folder)return class_folderdef crop_…

VPN是什么?

VPN&#xff0c;全称Virtual Private Network&#xff0c;即“虚拟私人网络”&#xff0c;是一种在公共网络&#xff08;如互联网&#xff09;上建立加密、安全的连接通道的技术。简单来说&#xff0c;VPN就像是一条在公共道路上铺设的“秘密隧道”&#xff0c;通过这条隧道传输…

图像的反转

图像颜色的反转一般分为两种&#xff1a;一种是灰度图片的颜色反转&#xff0c;另一种是彩色图像的颜色反转。 本节使用的原图如下&#xff1a; 1.1 灰度图像颜色反转 灰度图像每个像素点只有一个像素值来表示&#xff0c;色彩范围在0-255之间&#xff0c;反转方法255-当前像…

信创产业政策,信创测试方面

信创产业的政策支持主要体现在多个方面&#xff0c;这些政策旨在推动产业的快速发展&#xff0c;加强自主创新能力&#xff0c;保障国家信息安全&#xff0c;以及促进产业结构的优化升级。 首先&#xff0c;政府通过财政支持、税收优惠等方式&#xff0c;加大对信创产业的资金…

8.ApplicationContext常见实现

ClassPathXmlApplicationContext 基于classpath下xml格式的配置文件来创建 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…

Flutter——最详细(Drawer)使用教程

背景 应用左侧或右侧导航面板&#xff1b; 属性作用elevation相当于阴影的大小 import package:flutter/material.dart;class CustomDrawer extends StatelessWidget {const CustomDrawer({Key? key}) : super(key: key);overrideWidget build(BuildContext context) {return…

解决SeaTunnel 2.3.4版本写入S3文件报错问题

在使用Apache SeaTunnel时&#xff0c;我遇到了一个写入S3文件的报错问题。通过深入调试和分析&#xff0c;找到了问题所在&#xff0c;并提出了相应的解决方案。 本文将详细介绍报错情况、参考资料、解决思路以及后续研究方向&#xff0c;希望对大家有帮助&#xff01; 一、…

代码随想录算法训练营第二天|【数组】977.有序数组的平方

题目 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&#xff0c;数组…

修改头文件版本需要修改的文件

以修改ui的头文件版本为例&#xff0c;还需要同时更新 PJ10PC20240120041_c928\components\master-t5\hikauto\module\app\include PJ10PC20240120041_c928\components\master-t5\hikauto\module\app\include\dsp PJ10PC20240120041_c928\components\master-t5\hikauto\incl…

C# Halcon目标检测算法

在Halcon中进行目标检测可以使用传统的计算机视觉方法&#xff0c;也可以使用深度学习的方法。Halcon提供了丰富的函数库来处理这些任务&#xff0c;而在C#中使用Halcon&#xff0c;你需要通过Halcon .NET接口。 以下是使用Halcon进行目标检测的一般步骤&#xff0c;这里我将给…

DDL:针对于数据库、数据表、数据字段的操作

数据库的操作 # 查询所有数据 SHOW DATABASE; #创建数据库 CREATE DATABASE 2404javaee; #删除数据库 DROP DATABASE 2404javaee; 数据表的操作 #创建表 CREATE TABLE s_student( name VARCHAR(64), s_sex VARCHAR(32), age INT(3), salary FLOAT(8,2), c_course VARC…

Windows 的 MFC开发的使用示例——讲得挺好的

【Visual Studio 2019】创建 MFC 桌面程序 ( 安装 MFC 开发组件 | 创建 MFC 应用 | MFC 应用窗口编辑 | 为按钮添加点击事件 | 修改按钮文字 | 打开应用 )-腾讯云开发者社区-腾讯云 (tencent.com)

【算法】(C语言):堆排序

堆&#xff08;二叉树的应用&#xff09;&#xff1a; 完全二叉树。最大堆&#xff1a;每个节点比子树所有节点的数值都大&#xff0c;根节点是最大值。父子索引号关系&#xff08;根节点为0&#xff09;&#xff1a;&#xff08;向上&#xff09;子节点x&#xff0c;父节点(x…