当前位置: 首页 > news >正文

析构函数和拷贝构造函数

文章目录

  • 析构函数
    • 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;
}

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

总结:

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

相关文章:

  • 拼多多职位数据信息采集
  • 网格搜索(Grid Search)及其Python和MATLAB实现
  • 使用fabric8操作k8s
  • Firefox 编译指南2024 Windows10篇- 编译Firefox(三)
  • go语言怎么向kafka推送消息?
  • 计算机视觉-期末复习-简答/名词解释/综合设计
  • YOLOv5改进 | 损失函数 | EIoU、SIoU、WIoU、DIoU、FocuSIoU等多种损失函数
  • java前后端加密解密crypto-js_java crypto
  • python练习4
  • 大数据开发中如何计算用户留存及SQL示例
  • 常见VPS主机术语有哪些?VPS术语解析
  • element el-table表格切换分页保留分页数据+限制多选数量
  • GAMES104:04游戏引擎中的渲染系统1:游戏渲染基础-学习笔记
  • React快速入门-跟着AI学习react
  • 二手物品交易小程序的设计
  • canvas 五子棋游戏
  • vue 配置sass、scss全局变量
  • 深度解析利用ES6进行Promise封装总结
  • UI设计初学者应该如何入门?
  • ​虚拟化系列介绍(十)
  • # linux 中使用 visudo 命令,怎么保存退出?
  • #android不同版本废弃api,新api。
  • #Ubuntu(修改root信息)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (8)STL算法之替换
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (TOJ2804)Even? Odd?
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (九)信息融合方式简介
  • (十三)Maven插件解析运行机制
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)我也是一只IT小小鸟
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net开发时的诡异问题,button的onclick事件无效
  • .net连接oracle数据库
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • ;号自动换行
  • @AliasFor注解
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [android学习笔记]学习jni编程
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [bzoj2957]楼房重建
  • [CTF]2022美团CTF WEB WP
  • [C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!
  • [Flex] PopUpButton系列 —— 控制弹出菜单的透明度、可用、可选择状态
  • [hive] posexplode函数
  • [Interview]Java 面试宝典系列之 Java 多线程
  • [JavaScript]_[初级]_[关于forin或for...in循环语句的用法]
  • [NOIP2007 普及组] 纪念品分组--贪心算法
  • [NSSCTF 2nd] web刷题记录