C++拷贝构造函数、赋值学习整理:
拷贝构造函数:
概念:
构造函数的第一个参数,是类本身的const引用(一般情况下没有其他参数,少数情况:其他参数必须有默认值!)称此类构造函数为拷贝构造函数
特征:
1:拷贝构造函数类名与函数值一致,没有返回值(与构造函数一致)
2:每个类都有拷贝构造函数,未定义时系统自动生成(可能产生错误)
默认生成的拷贝构造函数:为每个成员分配内存空间、成员变量赋值(浅拷贝)
3:调用时只有一个实参,要求函数不能重载
调用时仅对象作为实参,后面若有参数都为默认值,无法区分函数导致无法重载
4:第一个参数是类本身的const引用,存在其他有默认值的参数
//格式:
类名(const 类名&对象名);
class CPY
{public:CPY();//默认构造函数;CPY(const CPY& a);//拷贝构造函数...
};
拷贝构造函数的应用:
- 用已经存在的对象初始化构造新的对象
- 以类本身对象作为函数传递的实参,在非引用情况下(程序需要在函数中新创建一个相同的对象并复制值
- 返回类型为非引用类型的函数返回一个对象
int main()
{CPY a{...};//构造CPY b(a);//拷贝构造CPY c=a;//拷贝构造MAX(a);//-> int MAX(const CPY a) //函数五引用对象传参:拷贝构造用于传参MAX(a,b)//->CPY MAX(const CPY& a,const CPY& b) return a;//有引用的传参不是拷贝构造函数//函数返回值使用拷贝构造函数}
注意:
拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用,且这个参数几乎总是const的引用。
拷贝构造函数作用即将一个已经存在的对象用于初始化构造新的对象,我们没有定义拷贝构造函数时,系统将自动构造拷贝构造函数:从给定对象中依次将每个非static成员拷贝到正在创建的新对象中。即分以下几种情况:
-
- 当该类的对象都是普通变量,默认拷贝构造函数可完成值的拷贝(浅拷贝),正确
- 当类的对象中出现指针、数组等变量,默认函数拷贝原来对象成员中的值到新创建的指针的值、数组的首地址(浅拷贝),错误❌
- 原因以下浅拷贝仅仅拷贝值,导致多处指针指向同一地址,当其中多对象生命周期结束时析构函数将指针同一地址多次释放导致系统崩溃
- 解决方法自定义拷贝构造函数使用深拷贝:创建一新指针、数组(指向不同地址),再将其对象成员的指针、数组值赋值给新创建的对象成员(strcpy()或memcpy()),即得到指向不同地址的同值对象成员,满足拷贝构造函数、析构函数要求;
- 拷贝构造函数的参数采用引用方式,若是非引用:为调用拷贝构造函数需复制实参到形参,由复制的需要又得重新调用拷贝构造函数,产生无限循环;而引用即调用对象本身,无需复制。
引例:
class Complex //复数类
{public:Complex(double r, double i);Complex(const Complex& c);Complex add(Complex c);//加法private:double real; //实部double image; //虚部
};
Complex::Complex(double r, double i) :real(r), image(i)
{cout << "构造函数,实部:"<<real<<",虚部:"<<image << endl;
}
Complex::Complex(const Complex & c)
{real = c.real;image = c.image;cout << "拷贝构造函数,实部:" << real << ",虚部:" << image << endl;
}Complex Complex::add(Complex c)
{Complex y(real + c.real, image + c.image); //构造函数return y;//返回值为类对象,会调用拷贝构造函数
}
void f(Complex n) //参数是类对象,会调用拷贝构造函数
{cout << "f(Complex n)" << endl;
}
int main()
{Complex a(3, 4); //调用构造函数Complex b(6.5, 7.5);//调用构造函数Complex c(a); //拷贝构造函数Complex d = c;//拷贝构造函数,注意和下一节的赋值区分开f(b); //拷贝构造函数c = a.add(b); //拷贝构造函数return 0;
}
程序分析:
- 调用构造函数,创建了两个复数类对象a和b
- 用已知对象初始化另一个对象,系统调用拷贝构造函数
- 利用c初始化对象d,这一句看似=赋值,其实还是调用拷贝构造函数,因为这里还是初始化过程。
- Complex d=c 等同 Complex d(c) 等同 Complex d{c},
- 将实参b传给形参n,因为形参是非引用的类对象,调用拷贝构造函数。
- 首先实参b传递给非引用形参c会调用拷贝构造函数,接着在add函数中定义了一个复数类对象y(24行),系统会调用构造函数。
- 最后,函数add的返回值是一个非引用对象,系统会创建一个临时对象,将局部对象y赋值给临时对象,这时也要调用拷贝构造函数。
赋值:
同类的对象之间可以互相赋值,即一个对象的值可以赋值给另一个对象。对象之间的赋值通过“=”进行。默认就是把一个对象所有非static数据成员的值依次赋值给另一个对象。
//格式
对象名1 = 对象名2;
说明:
(1)对象的赋值只对其中的数据成员赋值,不对成员函数赋值。
每个对象的数据成员占用独立的存储空间,不同对象的数据成员占有不同的存储空间,赋值的过程是将一个对象的数据成员在存储空间的值复制给另一个对象的数据成员的存储空间。
而不同对象的成员函数是同一个函数代码段,不需要、也无法对它们赋值。
(2)类的数据成员中不能包括动态分配的数据,否则在赋值时可能出现意想不到的严重后果,(不同指针指向同一地址后多次释放delete,崩溃)
如果类的数据成员有指针,则一定要实现如下函数
1、构造函数 (如果没有,会出现野指针)
2、拷贝构造函数(如果没有,会出现浅拷贝)
3、重载 = 符号 (如果没有,会出现浅拷贝)
2、析构函数(内存泄漏)
delete动态对象则自动调用析构函数,不delete不调用析构函数
而动态成员需系统调用析构函数delete
拷贝构造函数与赋值区分:拷贝构造定义初始化阶段,赋值在定义完成后进行。
运算符重载
在类中重新定义运算符,赋予运算符新的功能以适应类的运算,如果某个运算符重载了,那么在使用该运算符时,系统会自动调用。
格式如下:
返回值类型 operator 运算符(参数);
//注意 operator关键字必须写//例如:operator +()//表示:重载+运算符operator *()//表示:重载*运算符。
其中,operator 是 C++的关键字,专门用于定义运算符重载函数。
运算符重载是一种形式的C++多态,它使得对象操作更直观,本质上也是属于函数重载。
假设有一个Student类,并为它定义了一个operator +()成员函数,以重载+运算符,如果有Student的对象s1,s2,s3。便可以编写这样的代码。
s1 = s2+s3; //简化
s1 = s2.operator+(s3);//复杂写法
已使用的引例:
1. 这是因为C++已经对string类重载了“+”运算符加法:
string s1="abc";string ;s2="xyz"; s1+s2;
2. C++对“<<”和“>>”进行了重载,用户在不同的场景下使用它们,作用是不同的。
对于位运算而言:“<<”运算符是左移运算符,“>>”运算符是右移运算符。
“<<”运算符在输出操作中与流对象cout配合使用,是流插入运算符;
“>>”运算符在输入操作中与流对象cin配合使用,是流提取运算符。
注意:运算符重载的赋值函数,要添加以下代码:避免同对象赋值判断
if(this==&s)
return;
// s 是实参地址
//防止同一地址相互赋值,先delete释放地址导致数据丢失
相关文章:

C++拷贝构造函数、赋值学习整理:
拷贝构造函数: 概念: 构造函数的第一个参数,是类本身的const引用(一般情况下没有其他参数,少数情况:其他参数必须有默认值!)称此类构造函数为拷贝构造函数 特征: 1&am…...

[亲测源码]ps软件网页版在线使用 PS网站程序源码 photoshop网页版源码 网页版的ps软件源码
在线PS作图修图网页版PHP网站源码,PHP在线照片图片处理PS网站程序源码photoshop网页版。 有很多朋友们都是在用PS作图的,众所周知在使用和学习PS时是需要下载软件的,Photoshop软件对电脑配置也是有一定要求的,今天就为大家带来一…...

前端大厂面试题探索编辑部——第二期
目录 题目 单选题1 题解 关于TCP 关于UDP 单选题2 题解 A选项的HTTP是否是无状态协议 B选项的HTTP支持的方法 C选项的关于HTTP的状态码 D选项HTTP协议的传输格式 题目 单选题1 1.以下哪个描述是关于 TCP 和 UDP 的区别() A. TCP 是无连接的…...
yaml学习笔记
文章目录 yaml语言学习yaml 简介yaml 和json 区别基本语法数据类型YAML 对象YAML 数组锚点和引用纯量 参考文档 yaml语言学习 最近发现在学习k8s中各种配置文件 都是使用的yaml 这种格式, 包括 docker-compose.yaml 也都是用这个格式配置部署项目信息,我就了解了一下这个语法就…...

深度强化学习(王树森)笔记04
深度强化学习(DRL) 本文是学习笔记,如有侵权,请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接:https://github.com/wangshusen/DRL 源代码链接:https://github.c…...
openssl3.2/test/certs - 074 - CT entry
文章目录 openssl3.2/test/certs - 074 - CT entry概述笔记setup074.shsetup074_sc1.shsetup074_sc2.shsetup074_sc3.shEND openssl3.2/test/certs - 074 - CT entry 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 setup074.sh #! /bin/bash# \file setup074.sh# o…...

Angular组件(一) 分割面板ShrinkSplitter
Angular组件(一) 分割面板ShrinkSplitter 前言 分割面板在日常开发中经常使用,可将一片区域,分割为可以拖拽整宽度或高度的两部分区域。模仿iview的分割面板组件,用angular实现该功能,支持拖拽和[(ngModel)]双向绑定的方式控制区…...
抖音详情API:视频内容获取与解析技巧
一、引言 抖音是一款广受欢迎的短视频分享平台,每天都有大量的用户在抖音上分享自己的生活点滴和创意作品。对于开发者而言,如何获取并解析抖音上的视频内容,是一项极具挑战性的任务。本文将详细介绍抖音详情API,以及如何使用它来…...
SpringBoot中实现阿里云OSS对象存储
背景 在业务中我们往往需要上传文件如图片,文件上传,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发抖音、发朋友圈都用到了文件上传功能。 实现文件…...

大型语言模型 (LLM)全解读
一、大型语言模型(Large Language Model)定义 大型语言模型 是一种深度学习算法,可以执行各种自然语言处理 (NLP) 任务。 大型语言模型底层使用多个转换器模型, 底层转换器是一组神经网络。 大型语言模型是使用海量数据集进行训练…...

Unity - gamma space下还原linear space效果
文章目录 环境目的环境问题实践结果处理要点处理细节【OnPostProcessTexture 实现 sRGB 2 Linear 编码】 - 预处理【封装个简单的 *.cginc】 - shader runtime【shader需要gamma space下还原记得 #define _RECOVERY_LINEAR_IN_GAMMA】【颜色参数应用前 和 颜色贴图采样后】【灯…...

Rabbitmq调用FeignClient接口失败
文章目录 一、框架及逻辑介绍1.背景服务介绍2.问题逻辑介绍 二、代码1.A服务2.B服务3.C服务 三、解决思路1.确认B调用C服务接口是否能正常调通2.确认B服务是否能正常调用A服务3.确认消息能否正常消费4.总结 四、修改代码验证1.B服务异步调用C服务接口——失败2.将消费消息放到C…...

专业120+总分400+海南大学838信号与系统考研高分经验海大电子信息与通信
今年专业838信号与系统120,总分400,顺利上岸海南大学,这一年的复习起起伏伏,但是最后还是坚持下来的,吃过的苦都是值得,总结一下自己的复习经历,希望对大家复习有帮助。首先我想先强调一下专业课…...
如何区分 html 和 html5?
HTML(超文本标记语言)和HTML5在很多方面都存在显著的区别。HTML5是HTML的最新版本,引入了许多新的特性和元素,以支持更丰富的网页内容和更复杂的交互。以下是一些区分HTML和HTML5的关键点: 新特性与元素:H…...

Ps:将文件载入堆栈
Ps菜单:文件/脚本/将文件载入堆栈 Scripts/Load Files into Stack 将文件载入堆栈 Load Files into Stack脚本命令可用于将两个及以上的文件载入到同一个 Photoshop 新文档中。 载入的每个文件都将成为独立的图层,并使用其原始文件名作为图层名。 Photos…...

【格密码基础】:补充LWE问题
目录 一. LWE问题的鲁棒性 二. LWE其他分布选择 三. 推荐文献 四. 附密码学人心中的顶会 一. LWE问题的鲁棒性 robustness,翻译为鲁棒性 已有的论文表明,及时敌手获取到部分关于秘密和error的信息,LWE问题依旧是困难的,这能…...

【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
阅读导航 引言一、特殊类 --- 不能被拷贝的类1. C98方式:2. C11方式: 二、特殊类 --- 只能在堆上创建对象的类三、特殊类 --- 只能在栈上创建对象的类四、特殊类 --- 不能被继承的类1. C98方式2. C11方法 总结温馨提示 引言 在面向对象编程中࿰…...

VMware虚拟机部署Linux Ubuntu系统
本文介绍基于VMware Workstation Pro虚拟机软件,配置Linux Ubuntu操作系统环境的方法。 首先,我们需要进行VMware Workstation Pro虚拟机软件的下载与安装。需要注意的是,VMware Workstation Pro软件是一个收费软件,而互联网中有很…...

RFID标签:数字时代的智能身份
在数字时代,RFID标签(Radio-Frequency Identification)成为物联网(IoT)中不可或缺的一环。作为一种小巧却功能强大的设备,RFID标签在各个领域的应用不断扩展,为我们的生活和工作带来了新的可能性…...
《动手学深度学习(PyTorch版)》笔记3.2
注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过。…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...