类和对象的深入了解4

news2025/1/9 1:04:00

1.析构函数

1.1析构函数概念

与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成 的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。它的名字与类名相同,前面加上一个波浪号(~),没有返回类型,也没有参数。当对象被销毁时,析构函数会自动被调用。

class MyClass {
public:
    // 构造函数
    MyClass() {
        // 初始化对象
    }

    // 析构函数
    ~MyClass() {
        // 清理对象
    }
};
 

需要注意的是析构函数,一个类就只能有一个析构函数,不能想构造函数那样进行重载。

1.2析构函数的使用 

析构函数也是一个默认成员函数,在我们未显示写时,会自动生成析构函数。

 上述代码中,我们创建了两个类,在B中创建了A类型的成员变量,我们只在A中显示写析构函数,B中没有写,当我们再运行一步会发生什么呢?

我们发现B中默认生成的析构函数去自动调用了A中的析构函数,但是未对B中内置类型起作用。

所以对于自定义类型会去调用相应的析构函数。

 其实当我们没有在A中写析构函数,程序依然能正常运行,因为上述代码中所申请的空间都会在程序结束后销毁。所以不是所有的类都需要析构函数,我们现在只需要默认知道像动态申请空间和打开文件需要即可。

自动生成的析构函数会按照默认行为来销毁对象。默认的析构函数不执行任何操作,它只是简单地销毁对象并释放对象占用的内存。这种情况适用于大多数类,特别是当类没有动态分配的资源或需要特殊的清理操作时。

然而,在某些情况下,需要手动定义析构函数来执行特定的清理操作。例如,如果类使用了动态分配的内存,我们需要在析构函数中释放这些内存。另外,如果类打开了一些文件或建立了网络连接,我们需要在析构函数中关闭文件或断开网络连接。

总而言之,自动生成的析构函数能够满足大多数情况下的需要,但在特定情况下可能需要手动定义析构函数,并编写相应的清理代码。

2.拷贝构造函数

1.1概念

只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型 对象创建新对象时由编译器自动调用。简单来说就是用对象去初始化对象

1.2特性

1. 拷贝构造函数是构造函数的一个重载形式

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

3.拷贝构造函数也是默认成员函数。

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

为何会发生无穷的递归调用呢?

其实在C++中传类时会自动调用拷贝构造函数,若拷贝构造函数的形参是类,而不是类的引用,那么就会出现无穷递归。

如上图,我们在使用拷贝构造时,传的d1而引发拷贝构造,而此时我们传的d1给另一个拷贝构造,但是另一个拷贝构造,又开始调用另一个拷贝构造,这样下去就会形成无穷递归。

1.3使用
class A {
public:
	A(int year = 2024, int month = 2, int day = 1) {
		_year = year;
		_month = month;
		_day = day;
	}
	A(const A& s) {
		_year = s._year;
		_month = s._month;
		_day = s._day;
	}
	void print() {
		cout << _year << "_" << _month << "_" << _day << endl;
	}
private:
		int _year;
		int _month;
		int _day;
};

int main() {
	A b;
	A b1(b);
	A b2 = b;//拷贝构造的两种调用
	b1.print();
	b2.print();
	return 0;
}

我们来看一下输出结果:

我们拷贝构造成功了,那么我们将显示写的拷贝构造删掉,默认生成的拷贝构造还可以完成任务呢?

 

我们发现自动生成的拷贝构造够用,但是需要注意的是这里是浅拷贝,是按照字节来拷贝的,如果我们有申请动态空间,然后用默认生成的拷贝构造来生成对象,这样只会对值进行拷贝,但是不会开辟动态空间,这样就会出问题,所以当我们申请动态空间的类需要拷贝构造时需要我们自行去现实些深拷贝。 

类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请时,则拷贝构 造函数是一定要写的,否则就是浅拷贝。

谢谢

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

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

相关文章

LLM大模型:十大人工智能大模型技术介绍

十大人工智能大模型技术的简介&#xff1a; 深度学习模型 深度学习是人工智能领域中一种重要的机器学习技术&#xff0c;通过构建深度神经网络来模拟人脑的认知过程。深度学习模型能够自动提取数据的特征&#xff0c;并在海量数据中进行学习和优化&#xff0c;从而在语音识别…

79.WEB渗透测试-信息收集-框架组件识别利用(3)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;78.WEB渗透测试-信息收集-框架组件识别利用&#xff08;2&#xff09;-CSDN博客 struts2…

长面板数据实证模型及 Stata 具体操作步骤

目录 一、文献综述 二、理论原理 三、实证模型 四、稳健性检验 五、程序代码及解释 六、代码运行结果 一、文献综述 长面板数据在经济学、金融学、社会学等领域的研究中得到了广泛应用。许多学者通过构建长面板数据模型来研究各种经济现象和社会问题。例如&#xff0c;在研…

乌班图下的vscode粘贴代码后一直在输入CTRLV命令

最近在VMware中使用vscode开发c程序中&#xff0c;拷贝一段代码后&#xff0c;代码界面一直输入CTRLV命令&#xff0c;导致乌班图桌面死掉&#xff0c;无法操作、 解决方法&#xff1a; 1、强制重启。长按电源按钮强制关机&#xff0c;然后再次开机。 2、使用命令行界面。同时…

电测量数据交换DLMS_COSEM组件第47部分:基于IP网络的DLMS_COSEM传输层

1.范围 本部分规定了面向无连接和连接的在IP网络中所使用的DLMS/COSEM通信协议集的传输层(TL)。 这些传输层为用户DLMS/COSEM的应用层提供OSI式服务。面向无连接的传输层基于互联网标准用户数据报协议(UDP)。面向连接的传输层基于互联网标准传输控制协议(TCP)。 DLMS/CO…

C++:map和set

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;map和set》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&#xff01;&#xff01;…

redis的代码开发

redis是什么? 前提:官网地址https://redis.io 1.Redis是一个开源的,key,value格式的,内存型数据结构存储系统;它可用作数据库、缓存和消息中间件。 value支持多种类型的数据结构如strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglo…

亚马逊测评自养号有什么优势?

在当今竞争激烈的电商市场中&#xff0c;若想实现销量的显著增长&#xff0c;测评策略已成为不可或缺的一环&#xff0c;尤其是对于新入驻平台的店铺及推出的创新产品而言&#xff0c;仅凭初期的自然流量难以迅速脱颖而出&#xff0c;因此众多跨境卖家纷纷采用测评手段&#xf…

微信小程序教程002:代码结构介绍和新建小程序页面

文章目录 代码介绍1、小程序代码构成2、小程序页面组成部分3、JSON配置文件的作用3.1 app.json文件3.2 project.config.json文件3.3 sitemap.json文件3.4 页面的.json文件新建小程序页面WXML和WXSS介绍1、什么是WXML2、什么是WXSS小程序的JS文件1、JS文件2、小程序中JS文件分类…

【机器学习】探索图神经网络 (GNNs): 揭秘图结构数据处理的未来

&#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ ​ &#x1f48e;1. 引言 图结构数据在现实世界中无处不在&#xff0c;从社交网络中的用户关系&#xff0c;到推荐系统中的用户-物品交互&#xff0c;再到生物信息学中的分子结构。传统的机器学习模型在处理这些数据时常常力…

C#高级:枚举(Enum)从索引、值到注释的完整使用技巧

目录 一、推荐的枚举写法 二、获取注释的封装代码 三、已知【枚举】&#xff0c;获取注释、索引 四、已知【索引】&#xff0c;获取枚举值、注释 五、已知【注释】&#xff0c;获取枚举值、索引 六、创建一个【枚举字典】&#xff0c;key索引&#xff0c;value(枚举值&am…

入选ICML!麻省理工团队基于AlphaFold实现新突破,揭示蛋白质动态多样性

作为生物体的重要组成部分&#xff0c;蛋白质具有不同状态&#xff0c;基于集体运动或无序波动的不同结构组合&#xff0c;采用复杂的三维结构&#xff0c;来执行丰富的生物功能&#xff0c;例如&#xff0c;蛋白质构象变化对转运体、通道和酶的功能至关重要&#xff0c;而平衡…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 围棋的气(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

Oracle特有的DECODE函数

Oracle中的DECODE函数是一种条件表达式函数&#xff0c;用于基于给定的条件从一组值中选择一个值返回。它的基本语法如下&#xff1a; DECODE(expression, search1, result1, [search2, result2, ...], [default])expression&#xff1a;要比较的表达式或列。searchN&#xff…

正点原子imx6ull-mini-Linux驱动之pinctrl 和 gpio 子系统(5)

1&#xff1a;pinctrl 子系统 1.1&#xff1a;pinctrl 子系统简介 Linux 驱动讲究驱动分离与分层&#xff0c;pinctrl 和 gpio 子系统就是驱动分离与分层思想下的产物&#xff0c; 驱动分离与分层其实就是按照面向对象编程的设计思想而设计的设备驱动框架 来回顾一下上一章是…

2006年威廉王子提出分手 舞会上凯特一袭护士装令他再次沦陷 迅速和好

虽然威廉王子和凯特米德尔顿是当今最有影响力和最令人心动的情侣之一&#xff0c;但许多人可能忘记了&#xff0c;早在 2006 年&#xff0c;两人还在约会时&#xff0c;他们曾短暂分手。尽管当时他们的分手可能让英国媒体感到意外&#xff0c;但不到一年后&#xff0c;两人就和…

Window部署Ollama+Qwen2.0+Open-WebUI

文章目录 Windows下安装Docker安装Docker检查是否安装成功, 出现版本即为安装成功安装Ollama启动 Ollama 并拉取模型(选做) 修改默认地址和端口(选做) Ollama 进行跨域配置安装open-webui Windows下安装Docker 准备条件 开启Hyper-V&#xff0c;在“启用或关闭Windows功能”里…

全网最强Linux教程 | 万字长文爆肝Linux操作系统

Linux 1.Linux的引言 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展&#xff0c;Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器操作系统方面保…

【数据保护】微软开源数据保护项目Presidio-匿名器

Presidio是由微软维护的开源数据保护项目&#xff0c;其主要包含三个功能模块&#xff0c;分别是&#xff1a; Presidio analyzer:该模块主要负责文本类数据敏感信息扫描。Presidio anonymizer:该模块主要负责对已检测到的敏感实体进行脱敏处理。Presidio image redactor&…

【深度学习】语音,Tacotron 2 ,TTS合成

图1展示了Tacotron 2系统架构的框图。该系统包含两个主要部分&#xff1a;特征预测网络和WaveNet vocoder。以下是架构的详细说明&#xff1a; 特征预测网络 输入文本&#xff1a;系统从输入文本开始&#xff0c;经过一系列处理生成语音特征。字符嵌入层&#xff1a;输入的字…