从零开始的C++(四)

上篇链接:http://t.csdnimg.cn/3nyT9

1.拷贝构造函数:

上篇中介绍了析构函数,即在对象销毁时自动调用的函数,常用于含有malloc、fopen等成员变量的对象。然而,在将对象做函数实参进行值传递的时候,可能会因为析构函数引发一些错误,实例如下:

class stack
{   
public:stack(int n=16){   //开辟空间if (n == 0){_arry = nullptr;}else{_arry = (int*)malloc(sizeof(int) * n);_size = 0;_capacity = n;}}~stack(){//销毁空间free(_arry);_size = _capacity = 0;}int* _arry;int _size;int _capacity;
};int GetSNum(stack s)
{return s._size;}int main()
{stack s1;GetSNum(s1);}

上述代码只是创造了一个stack类的对象,然后用值传递的方式求对象的一个成员变量,但却报错了,原因便是析构函数。值传递到形参后,形参的_arry变量和实参的_arry变量存放的内容一样,均是s1构造函数开辟的那份空间,而形参在函数结束后销毁,进行一次析构函数调用,而实参在main函数结束后也销毁,进行一次析构函数调用,两次析构调用free了同一份空间,因此产生了报错。那么这种现象该如何避免,方法一就是形参采用引用的方式,因为引用是取一份别名,因此函数调用完后不会销毁,析构函数也不会调用,就不会出现free两次的情况了。方法二就是重写拷贝构造函数(通过重写拷贝构造使得形参的_arry开辟一块新的空间)。

拷贝构造函数是默认成员函数的其中之一,即不写的话编译器会调用默认拷贝构造函数。其的特点是只有一个参数,是同类型对象的引用。(注:必须是引用不能是值,不然会出现无限拷贝的情况)。同时,为了防止引用的对象的值被修改,常用const修饰。一般来说,自定义类型需要进行值传递的话,必须重写拷贝构造函数。

拷贝构造函数的调用方式有两种:

1.类名+对象名(对象);

2类名+对象名=对象;

两种方法的结果相同,可以任选一种使用。

默认拷贝构造函数:

1.成员是内置类型会进行值传递,成员是自定义类型会调用其拷贝构造函数。

2.拷贝构造函数重写常是有malloc、fopen的成员变量。

2.运算符重载:

运算符重载的本质是函数,用于对自定义类型的对象进行运算。

写法:返回类型+operator+运算符+()。

特点:

1.不能创造新的运算符。

2.至少要有一个参数是自定义类型。(防止重载后的运算符和原有的运算符算法产生冲突,如重载两个整形的加法为减法,就会和原本加法产生冲突,因此不行)。

3.不能修改运算符对应的操作数的个数(如加法操作数是两个,不能重载成别的个数)。

4.":: " ,"sizeof”     ,       " ."      ,       “ *. ”不能重载。

5.运算符可以作为成员函数,此时形参内的参数要比实际的参数少一个,因为有一个是隐含的this指针。此时的调用方式有 对象名 操作符 对象名、对象名.operator操作符(对象名)。

本篇讲述了拷贝构造函数,初步了解了运算符重载

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

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

相关文章

【算法训练-贪心算法 一】买卖股票的最佳时机II

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【贪心算法】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…

简化数据库操作:探索 Gorm 的约定优于配置原则

文章目录 使用 ID 作为主键数据库表名TableName临时指定表名列名时间戳自动填充CreatedAtUpdatedAt时间戳类型Gorm 采用约定优于配置的原则,提供了一些默认的命名规则和行为,简化开发者的操作。 使用 ID 作为主键 默认情况下,GORM 会使用 ID 作为表的主键: type User st…

十四天学会C++之第三天(数组和字符串)

1. 数组的定义和初始化 数组是一种由相同数据类型的元素组成的集合,这些元素按照一定的顺序存储在连续的内存位置上。数组的大小在创建时是固定的,无法在运行时改变。 在C中,数组的定义和声明非常简单。定义一个数组: 数据类型…

(SAR)Sentinel-1影像自动下载

基于ASF网站提供的python代码,实现Sentinel-1影像的自动下载; 1、登录ASF网站 登录Sentinel-1影像ASF网站:https://search.asf.alaska.edu/; 点击网站最右侧Sign in图标,进行用户注册; 注册完用户之后&…

宠物医院必备,介绍一款宠物疫苗接种管理软件

在当今社会,养宠物已经成为越来越多人的生活方式,宠物疫苗接种已是宠物医院的重要工作,但是目前绝大多数的宠物医院对疫苗接种的管理,还是采取人工登记方式,不仅效率低下,而且无法做到疫苗接种到期自动提醒…

如何使用ArcGIS Pro制作标准地图样式国界

相信大家都浏览过标准地图服务提供的标准地图,不知道你有没有想过尝试制作里面的国界,这里为大家介绍一下制作方法,希望能对你有所帮助。 制作已定国界 在地图数据内,国界分为已定国界、未定国界和海岸线,我们先对已定…

基于蜉蝣优化的BP神经网络(分类应用) - 附代码

基于蜉蝣优化的BP神经网络(分类应用) - 附代码 文章目录 基于蜉蝣优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.蜉蝣优化BP神经网络3.1 BP神经网络参数设置3.2 蜉蝣算法应用 4.测试结果:5.M…

【算法训练-二分查找 一】二分查找、在排序数组中查找元素的第一个和最后一个位置

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是螺旋矩阵,使用【二维数组】这个基本的数据结构来实现 二分查找【EASY】 从最简单的二分查找入手,进而开始解决一系列其变体…

Linux:minishell

目录 1.实现逻辑 2.代码及效果展示 1.打印字符串提示用户输入指令 2.父进程拆解指令 3.子进程执行指令,父进程等待结果 4.效果 3.实现过程中遇到的问题 1.打印字符串的时候不显示 2.多换了一行 3.cd路径无效 4.优化 1.ll指令 2.给文件或目录加上颜色 代码链接 模…

基于SpringBoot的流浪动物管理系

基于SpringBoot的流浪动物管理系的设计与实现,前后端分离 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 首页 后台登陆界面 管理员界面 摘要 基于Spring Boot的…

【通意千问】大模型GitHub开源工程学习笔记(1)--依赖库

9月25日,阿里云开源通义千问140亿参数模型Qwen-14B及其对话模型Qwen-14B-Chat,免费可商用。 立马就到了GitHub去fork。 GitHub: GitHub - QwenLM/Qwen: The official repo of Qwen (通义千问) chat & pretrained large language model proposed b…

Guava限流器原理浅析

文章目录 基本知识限流器的类图使用示例 原理解析限流整体流程问题驱动1、限流器创建的时候会初始化令牌吗?2、令牌是如何放到桶里的?3、如果要获取的令牌数大于桶里的令牌数会怎么样4、令牌数量的更新会有并发问题吗 总结 实际工作中难免有限流的场景。…