【C++第二阶段】赋值运算符重载

你好你好!
以下内容仅为当前认识,可能有不足之处,欢迎讨论!


文章目录

  • 赋值运算符重载


赋值运算符重载

实验①,还没有对析构运算符重载时

#include<iostream>
#include<string>
using namespace std;class Person {friend void test_0210_0();
public:Person();Person(int age);
private:int *person_age;
};Person::Person(int age) {person_age = new int(age);//构造函数,使得传入的参数能够作为类的成员属性传进去
}void test_0210_0() {Person pe(18);Person rs(20);cout << "没有重载赋值运算符之前,实验部分.........." << endl;cout << "pe age = " << *pe.person_age << "." << endl;cout << "rs age = " << *rs.person_age << "." << endl;cout << "---------------------------------" << endl;pe = rs;cout << "pe age = " << *pe.person_age << "." << endl;cout << "rs age = " << *rs.person_age << "." << endl;cout << endl;
}int main() {cout << "hello world !" << endl;test_0210_0();system("pause");return 0;
}

结果:

image-20240210214939218

重载析构函数后,没有重载赋值运算符,会出现释放内存后,另一个对象的指针指向这个不存在的地址的问题。

#include<iostream>
#include<string>
using namespace std;class Person {friend void test_0210_0();friend void test_0210_1();friend void test_0210_2();friend void test_0210_3();
public:Person();~Person();Person(int age);
private:int *person_age;
};Person::Person(int age) {person_age = new int(age);//构造函数,使得传入的参数能够作为类的成员属性传进去
}Person::~Person() {//重载析构函数,确定有这个问题:浅拷贝如果在这里人为释放地址,会使得后面的新对象发生错误if (person_age != NULL) {cout << "person_age指针有地址,删除中.........." << endl;delete person_age;person_age = NULL;cout << "删除成功!" << endl;}
}void test_0210_0() {Person pe(18);Person rs(20);cout << "没有重载赋值运算符之前,实验部分.........." << endl;cout << "pe age = " << *pe.person_age << "." << endl;cout << "rs age = " << *rs.person_age << "." << endl;cout << "---------------------------------" << endl;pe = rs;cout << "pe age = " << *pe.person_age << "." << endl;cout << "rs age = " << *rs.person_age << "." << endl;cout << endl;
}int main() {cout << "hello world !" << endl;test_0210_0();system("pause");return 0;
}

结果:

运行到这一步就停住…

image-20240210224641432

image-20240210224833166

对同一块地址重复释放了。

所以,需要重写赋值运算符内容。

#include<iostream>
#include<string>
using namespace std;class Person {friend void test_0210_0();friend void test_0210_1();
public:Person();~Person();Person(int age,string name);//返回值写什么?写类Person& operator=(Person &person); 
private:int *person_age;string person_name;
};Person::Person(int age , string name) {person_age = new int(age);//构造函数,使得传入的参数能够作为类的成员属性传进去string person_name = name;
}Person::~Person() {//重载析构函数,确定有这个问题:浅拷贝如果在这里人为释放地址,会使得后面的新对象发生错误if (person_age != NULL) {cout << "person_age指针有内容,释放中.........." << endl;delete person_age;person_age = NULL;cout << "删除成功!" << endl;}else {}
}Person& Person::operator=(Person& temp) {//参数这里应该用引用,因为不需要重复赋值//这里的参数是后面的rs//if (person_age != NULL) {//应该先判断属性中的person_age 是否有地址,如果没有,先删除了再说if (this != NULL) {delete person_age;person_age = new int(*temp.person_age);//整型指针指向新的内存空间开辟的相同值}return *this;//这里返回的是具体的对象,如果函数定义是person,相当于新的值,而不是本身。
}void test_0210_0() {string name_pe = "pe";string name_rs = "rs";Person pe(18 , name_pe);Person rs(20 , name_rs);cout << "没有重载赋值运算符之前,实验部分.........." << endl;cout << "pe age = " << *pe.person_age << "." << endl;cout << "rs age = " << *rs.person_age << "." << endl;cout << "---------------------------------" << endl;pe = rs;//rs = pe;cout << "重载赋值运算符之后,实验部分..........." << endl;cout << "pe age = " << *pe.person_age << "." << endl;cout << "rs age = " << *rs.person_age << "." << endl;cout << endl;
}int main() {cout << "hello world !" << endl;test_0210_0();system("pause");return 0;
}

同时,写了返回值后,能够链式调用赋值运算符。

image-20240211002249777

遗留有一个问题:为什么这里

Person& Person::operator=(Person& temp) {//参数这里应该用引用,因为不需要重复赋值//这里的参数是后面的rs//if (person_age != NULL) {//应该先判断属性中的person_age 是否有地址,如果没有,先删除了再说if (this != NULL) {delete person_age;person_age = new int(*temp.person_age);//整型指针指向新的内存空间开辟的相同值}return *this;//这里返回的是具体的对象,如果函数定义是person,相当于新的值,而不是本身。
}

返回值为Person,没有报错(因为引用和Person类一样),但是使用完后调用这个赋值运算符的对象会调用析构函数呢?


以上是我的学习笔记,希望对你有所帮助!
如有不当之处欢迎指出!谢谢!

学吧,学无止境,太深了

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

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

相关文章

失去中国市场的三星仍是全球第一,但中国手机无法失去海外市场

随着2023年分析机构公布全球手机市场和中国手机市场的数据&#xff0c;业界终于看清中国市场早已没有以前那么重要&#xff0c;三星、苹果这些国际品牌对中国市场的依赖没有他们想象的那么严重&#xff0c;相反中国手机对海外市场比以往任何时候都要更依赖了。 三星在2023年被苹…

消息队列使用的四种场景介绍

一、简介 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题。 实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。 使用较多的消息队列有ActiveMQ&#xff0c;RabbitMQ&#xff0c;ZeroMQ…

【开源】SpringBoot框架开发个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

docker之centos7容器常用命令和服务安装

一、前言 以前我们如果想在windows环境下使用linux系统&#xff0c;最早的是一台主机上安装双机系统&#xff0c;再后来我们有了VMware&#xff0c;可以通过workstations虚拟化平台安装虚拟机。现在我们还可以通过docker安装linux容器&#xff0c;容器更轻量也更便捷。不过凡事…

SpringCloud-高级篇(二十一)

前面解决了消息的可靠性、消息的延迟问题&#xff0c;下面研究一下消息的堆积的问题&#xff1a; &#xff08;1&#xff09;消息堆积问题 消息产生堆积&#xff0c;上限后&#xff0c;最早的消息成为死信&#xff0c;有消息被丢弃&#xff0c;这对安全性较高的业务中是不行的…

HiveSQL——条件判断语句嵌套windows子句的应用

注&#xff1a;参考文章&#xff1a; SQL条件判断语句嵌套window子句的应用【易错点】--HiveSql面试题25_sql剁成嵌套判断-CSDN博客文章浏览阅读920次&#xff0c;点赞4次&#xff0c;收藏4次。0 需求分析需求&#xff1a;表如下user_idgood_namegoods_typerk1hadoop1011hive1…

JAVA设计模式之迭代器模式详解

迭代器模式 1 迭代器模式介绍 迭代器模式是我们学习一个设计时很少用到的、但编码实现时却经常使用到的行为型设计模式。在绝大多数编程语言中&#xff0c;迭代器已经成为一个基础的类库&#xff0c;直接用来遍历集合对象。在平时开发中&#xff0c;我们更多的是直接使用它&a…

解决 postman测试接口报404 Not Found

JDK版本&#xff1a;jdk17 IDEA版本&#xff1a;IntelliJ IDEA 2022.1.3 文章目录 问题描述原因分析解决方案 问题描述 当我使用postman测试接口时&#xff0c;报了 404 Not Found 的错误&#xff0c;报错截图如下所示 但我的后端程序中已经定义了该接口&#xff0c;如下所示 …

C语言指针2.0

1. 指针语法解剖 任意的指针&#xff0c;不管有多复杂&#xff0c;其定义都由两部分组成。 第1部分&#xff1a;指针所指向的数据类型&#xff0c;可以是任意的类型第2部分&#xff1a;指针的名字 char (*p1); // 第2部分&#xff1a;*p1; 第1部分&#xff1a;ch…

分享76个时间日期JS特效,总有一款适合您

分享76个时间日期JS特效&#xff0c;总有一款适合您 76个时间日期JS特效下载链接&#xff1a;https://pan.baidu.com/s/1s7tPGT_ItK7dNK5_qbZkug?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…

单片机——FLASH(2)

文章目录 flash &#xff08;stm32f40x 41x的内存映射中区域详解&#xff09;flash写数据时 flash &#xff08;stm32f40x 41x的内存映射中区域详解&#xff09; Main memory 主存储区 放置代码和常数 System memory 系统存储区 方式bootloader代码 OTP区 一次性可编程区 选项…

解决Typora导出HTML不显示图片

解决Typora导出HTML不显示图片 产生原因 Typora导出HTML不显示图片&#xff0c;可能时图片存放在我们的硬盘中。 我们可以将markdown中的图片转化为base64格式&#xff0c;嵌入到html中。 解决步骤 首先&#xff0c;下载 TyporaToBase64.jar 密码:45jq 其次&#xff0c;将…

Netty应用(五) 之 Netty引入 EventLoop

目录 第三章 Netty 1.什么是Netty&#xff1f; 2.为什么需要使用Netty&#xff1f; 3.Netty的发展历程 4.谁在使用Netty&#xff1f; 5.为什么上述这些分布式产品都使用Netty&#xff1f; 6.第一个Netty应用 7.如何理解Netty是NIO的封装 8.logback日志使用的加强 9.Ev…

无人机飞行原理,多旋翼无人机飞行原理详解

多旋翼无人机升空飞行的首要条件是动力&#xff0c;有了动力才能驱动旋粪旋转&#xff0c;才能产生克服重力所必需的升力。使旋翼产生升力&#xff0c;进而推动多旋翼无人机升空飞行的一套设备装置称为动力装置&#xff0c;包括多旋翼无人机的发动机以及保证发动机正常工作所必…

知识价值2-什么是IDE?新手用哪个IDE比较好?

IDE是集成开发环境&#xff08;Integrated Development Environment&#xff09;的缩写&#xff0c;是一种软件应用程序&#xff0c;旨在提供集成的工具集&#xff0c;以方便开发人员进行软件开发。IDE通常包括代码编辑器、编译器、调试器和其他工具&#xff0c;以支持软件开发…

【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目

作者推荐 视频算法专题 本博文涉及知识点 深度优先搜索 树 图论 分类讨论 LeetCode2973. 树中每个节点放置的金币数目 给你一棵 n 个节点的 无向 树&#xff0c;节点编号为 0 到 n - 1 &#xff0c;树的根节点在节点 0 处。同时给你一个长度为 n - 1 的二维整数数组 edges…

C++2024寒假J312实战班2.5

题目列表&#xff1a; #1多项式输出 #2龙虎斗 #3表达式求值 #4解密 #1多项式输出 这是第一个题目很简单&#xff0c;我也作对了。 我们下来看一下题目&#xff1a; 我们先来看一下样例&#xff1a; 5 100 -1 1 -3 0 10 首先100是第一项&#xff0c;所以不输出加号&…

【单片机】简单的自定义延时程序设计(代码演示)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY…

【Linux】信号保存与信号捕捉处理

信号保存与信号捕捉 一、信号保存1. 信号的发送2. 理解信号保存&#xff08;1&#xff09;信号保存原因&#xff08;2&#xff09;信号保存概念 3. 信号保存系统接口&#xff08;1&#xff09;sigset_t&#xff08;2&#xff09;sigprocmask()&#xff08;3&#xff09;sigpend…

论文阅读-GROUP:一种聚焦于工作负载组行为的端到端多步预测方法

摘要 准确地预测工作负载可以使网络服务提供商实现应用程序的主动运行管理&#xff0c;确保服务质量和成本效益。对于云原生应用程序来说&#xff0c;多个容器协同处理用户请求&#xff0c;导致每个容器的工作负载变化受到工作负载组行为的影响。然而&#xff0c;现有方法主要…