C++ 赋值运算符重载

 个人主页:Jason_from_China-CSDN博客

所属栏目:C++系统性学习_Jason_from_China的博客-CSDN博客

所属栏目:C++知识点的补充_Jason_from_China的博客-CSDN博客

概念概述

赋值运算符重载的特点:

  1. 成员函数:赋值运算符重载必须定义为类的成员函数。
  2. 参数:建议将参数声明为const类型的类引用,以避免不必要的拷贝。
  3. 返回值:应有返回值,且建议为当前类类型的引用,这样可以支持连续赋值操作,并提高效率。

编译器自动生成的赋值运算符:

  • 如果没有显式实现赋值运算符重载,编译器会提供一个默认实现。
  • 默认赋值运算符对内置类型成员变量执行值拷贝或浅拷贝。
  • 对自定义类型成员变量,会调用其赋值运算符重载函数。

特定情况下的赋值运算符重载:

  • 对于像Date这样只有内置类型成员的类,编译器自动生成的赋值运算符通常足够使用。
  • 对于像Stack这样包含指向资源的成员的类,需要自定义赋值运算符以实现深拷贝。
  • 对于像MyQueue这样包含自定义类型成员的类,如果这些成员的赋值运算符已经正确实现,通常不需要为MyQueue显式实现赋值运算符重载。

额外技巧:

  • 如果一个类显式实现了析构函数并释放资源,通常也需要显式实现赋值运算符重载,以确保资源被正确管理。

赋值运算符重载的使用以及注意事项

1,有返回值,建议写成const类类型的引用。因为C++规定类类型的传值传参,会调用拷贝构造,传递引用会减少拷贝(提高效率)

2,连续赋值的返回值

d3=d1;

返回值是d3,所以我们写代码的时候,要注意返回值,很可能是this

第一次赋值

第二次赋值

3,当返回的节点是d2,如何实现返回d2(用this,this本身指向的就是返回值)(这里注意:有返回值就支持连续赋值,但是返回的时候,需要注意)

注意:这里返回是可以用引用返回的,因为赋值运算符重载是两个已有的对象。出去作用域是依旧存在的(这里代码是传值返回,会增加拷贝)

4,这里还有一个问题,就是d1可以复制給給d1,所以为了防止自己給自己赋值 ,会进行判断

代码实现

//.h文件
//运算符重载,比较大小的实现,不在类里面实现
class Date
{
public:Date(int year = 1000, int month = 1, int day = 1);//声明给,定义不给Date(Date& d);void print();bool operator<(const Date& d);//比较日期大小(重载为成员函数)Date& operator++();Date& operator++(int);//赋值运算符重载(这里是可以加上const的,因为这里改变的是this不是d)Date& operator=(const Date& d);private:int _year;int _month;int _day;
};//.cpp实现文件
#include"类和对象的通篇实现.h"
//构造函数的实现(全缺省构造函数的实现)
Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;
}
//拷贝构造的实现
Date::Date(Date& d)
{_year = d._year;_month = d._month;_day = d._day;
}
//打印函数的实现
void Date::print()
{cout << _year << "/" << _month << "/" << _day << endl;
}//日期类的比较日期的大小,this-> < d.year 此时返回
bool Date::operator<(const Date& d)
{//比较年if (this->_year < d._year){return true;}else{if (this->_year == d._year && this->_month < d._month)//比较月{return true;}else if (this->_year == d._year && this->_month < d._month && this->_day < d._day)//比较日{return true;}}return false;
}//前置++
Date& Date::operator++()
{this->_day += 1;return *this;
}
//后置++
Date& Date::operator++(int)
{Date tmp = *this;this->_day += 1;return tmp;
}//赋值运算符重载(这里是可以加上const的,因为这里改变的是this不是d)
Date& Date::operator=(const Date& d)
{//地址不一样才进行赋值if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;
}//.cpp测试文件
//运算符重载,比较大小
int main()
{//构造和拷贝构造函数的使用Date d1(1000, 2, 1);d1.print();Date d2 = d1;d2.print();//比较年月日Date d3(999, 1, 1);bool ret1 = d1.operator<(d3);cout << ret1 << endl;Date d4(1100, 1, 1);bool ret2 = d1.operator<(d4);cout << ret2 << endl;//前置++和后置++cout << "前置++和后置++" << endl;d4.print();//1100 ,1,1d4.operator++();d4.print();Date ret = d4.operator++(1);ret.print();d4.print();//赋值运算符重载 cout << "赋值运算符重载" << endl;Date d5(1, 1, 1);d5.print();d5 = d4;//这样写也是对的//d5.operator=(d4);//这样写也是对的d5.print();return 0;
}

赋值运算符重载什么时候需要自己实现

注意:默认的赋值运算符重载也会完成浅拷贝(有资源,就需要自己完成赋值运算符重载)

1,内置类型不指向什么资源,不需要自己实现,编译器自动生成的就可以实现

2,栈和深拷贝,都需要自己写,和拷贝构造非常相似

3,如果写了析构函数,那么赋值运算符重载就需要自己写

几个函数之间进行对比

1、构造一般都需要自己写,自己传参定义初始化

2、析构,构造时有资源申请(如malloc或者fopen)等,就需要显示写析构函数

3、拷贝构造和赋值重载,显示写了析构,内部管理资源,就需要显示实现深拷贝

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

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

相关文章

IPv6(三)

文章目录 IPv6报文 IPv6报文 IPv6基本报头有8个字段&#xff0c;固定大小为40字节&#xff0c;&#xff0c;每个IPv6数据都必须包含报头&#xff0c;基本报头提供报文转发的基本信息&#xff0c;会被转发路径上面的所有路由器解析 IPv6报头长度为40字节Version&#xff1a;版本…

leetcode21. 合并两个有序链表

思路&#xff1a; 用一个新链表来表示合并后的有序链表&#xff0c; 每次比较两个链表&#xff0c;将较小的那个结点存储至新链表中 # Definition for singly-linked list. # class ListNode(object): # def __init__(self, val0, nextNone): # self.val val # …

sheng的学习笔记-AI-归纳逻辑程序设计(ILP)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 规则学习&#xff08;rule learning&#xff09;: sheng的学习笔记-AI-规则学习&#xff08;rule learning&#xff09;-CSDN博客 一阶规则学习&#xff1a; sheng的学习笔记-AI-FOIL(First-Order Inductive Learner)-CSD…

什么是 SSL 代理?

您可能已经对代理有所了解&#xff0c;例如移动代理、住宅代理和数据中心代理之间的区别。但是 SSL 代理到底是什么&#xff1f;它与其他类型的代理相比有何不同&#xff1f; 让我们分析一下&#xff0c;看看 SSL 代理有何特殊之处。 1.什么是 SSL/HTTPS 代理&#xff1f; SS…

《高等代数》分块矩阵(应用)

说明&#xff1a;此文章用于本人复习巩固&#xff0c;如果也能帮助到大家那就更加有意义了。 注&#xff1a;1&#xff09;利用分块矩阵的相关公式进行证明

[PTA]7-5 求组合数

[PTA]7-5 求组合数 输入格式: 输入在一行中给出两个正整数m和n&#xff08;m≤n&#xff09;&#xff0c;以空格分隔。 输出格式: 按照格式“result 组合数计算结果”输出。题目保证结果在double类型范围内。 输入样例: 2 7 输出样例: result 21 代码 #include<stdio…

【Linux进程控制】进程程序替换

目录 进程程序替换 替换函数 看现象 替换原理 多进程替换 exec*函数使用&#xff08;部分&#xff09;&#xff0c;并且认识函数参数的含义 1.execl 2.execv 3.execvp 4.execvpe execlp 和execlpe 替换函数总结 进程程序替换 替换函数 有六种以exec开头的函数&am…

unity将多层嵌套的结构体与json字符串相互转化

定义多个结构体&#xff0c;将结构体内容输入到最终的JObject中&#xff0c;然后将其转为字符串打印出来&#xff0c;即可。 代码内容如下&#xff1a; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using UnityEngine;public class Test : MonoBehaviour {private Ap…

3.接口测试的基础/接口关联(Jmeter工具/场景一:我一个人负责所有的接口,项目规模不大)

一、Jmeter接口测试实战 1.场景一&#xff1a;我一个人负责所有的接口&#xff1a;项目规模不大 http:80 https:443 接口文档一般是开发给的&#xff0c;如果没有那就需要抓包。 请求默认值&#xff1a; 2.请求&#xff1a; 请求方式:get,post 请求路径 请求参数 查询字符串参数…

二分算法——优选算法

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 本章我们来学习的是二分查找算法&#xff0c;二分算法的应用非常广泛&#xff0c;不仅限于数组查找&#xff0c;还可以用于解决各种搜索问题、查找极值问题等。在数据结构和算…

web - JavaScript

JavaScript 1&#xff0c;JavaScript简介 JavaScript 是一门跨平台、面向对象的脚本语言&#xff0c;而Java语言也是跨平台的、面向对象的语言&#xff0c;只不过Java是编译语言&#xff0c;是需要编译成字节码文件才能运行的&#xff1b;JavaScript是脚本语言&#xff0c;不…

【Java版】云HIS系统源码

云HIS系统介绍 云HIS系统是一款满足基层医疗机构各类业务需要的健康云产品。该产品能帮助基层医疗机构完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生站和护士站等一系列常规功能&#xff0c;还能与公卫、PACS等各类…

蓝星多面体foc旋钮键盘复刻问题详解

介绍&#xff1a; 本教程是针对立创开源项目 承载我所有幻想的键盘 - 立创开源硬件平台 作者是 蓝星多面体 这里我总结一下我复刻过程中的一些问题 一 <<编译环境怎么搭建&#xff1f;>> 第一步 安装vscode 下载vscode &#xff08;可以在各大应用平台…

【HarmonyOS 】编译报错:Install Failed: error: failed to install bundle

此问题是由于支付宝sdk兼容性造成的&#xff0c;目前只能删除支付宝sdk依赖&#xff0c;如下图所示操作&#xff0c;删除后需要点右上角的 Sync Now&#xff0c;并等待 Sync 结束 删除后还需要点右上角的 Sync Now&#xff0c;并等待 Sync 结束 uniapp解决方案&#xff1a; htt…

mysql5.7小版本升级

最近因为mysql漏洞问题需要升级版本 目标&#xff1a;5.7.17升级到最新的5.7.44 提前准备&#xff1a;必须 MySQL :: Download MySQL Community Server (Archived Versions) 下载最新的5.7版本5.7.44&#xff0c;下载后&#xff0c;解压备用 ​ 方案1&#xff1a;卸载原有…

[C语言]第九节 函数一基础知识到高级技巧的全景探索

目录 9.1 函数的概念 9.2 库函数 9.2.1 标准库与库函数 示例&#xff1a;常见库函数 9.2.2 标准库与头文件的关系 参考资料和学习工具 如何使用库函数 ​编辑 9.3 ⾃定义函数 9.3.1 函数的语法形式 9.3.2函数的举例 9.4 实参与形参 9.4.1 什么是实参&#xff1f; 9…

求Huffman树及其matlab程序详解

#################本文为学习《图论算法及其MATLAB实现》的学习笔记################# 算法用途 求Haffman树 算法思想 根据定理4.17,给出求Huffman树的算法步骤如下: ①对给出的所要求的叶子顶点的权进行从小到大排序,写出的权重向量 ; ②根据定理4.17,写出兄弟的权重分别为…

《Pyramid Vision Transformer》论文笔记

原文笔记 What 为了解决VIT在视觉任务上的局限性并且探究Transformer模型在视觉任务上的应用&#xff0c;这项工作提出了一种纯 Transformer 主干&#xff0c;称为 Pyramid Vision Transformer (PVT)&#xff0c;它可以作为 CNN 主干在许多下游任务中的替代方案&#xff0c;包…

全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类

全网最适合入门的面向对象编程教程&#xff1a;50 Python 函数方法与接口-接口和抽象基类 摘要&#xff1a; 在 Python 中&#xff0c;接口和抽象基类&#xff08;Abstract Base Classes, ABCs&#xff09;都用于定义类的结构和强制子类实现特定的方法&#xff0c;Python 没有…

基于ExtendSim的 电子制造 仿真模型

说明&#xff1a; 此模型表示电路板制造设施。该过程有4个步骤&#xff1a; *焊料制备 *组件放置 *烤箱 *检查 详情&#xff1a; *烤箱的容量为10张卡&#xff0c;但如果烤箱循环开始时仅能处理5张卡&#xff0c;则最多只能处理5张。 *如果检查员发现问题&#xff0c;他们将修理…