【C++】- 类和对象

类和对象③

  • 介绍运算符重载
  • 赋值运算符重载
  • ++运算符重载

在这里插入图片描述在学习C语言时,我们首先接触的就是变量,再深入学习,我们可以利用运算符对变量进行操作,当我们使用C++编写程序时,经常会遇到一些需要对特殊的例如自定义数据类型进行特殊操作的情况。为此,C++提供了运算符重载的机制,可以通过重新定义运算符的行为,实现对自定义数据类型的运算进行特殊定义和处理。在本文中,我们将探讨运算符重载的概念、语法以及一些实际应用。

运算符重载是指通过重新定义运算符的行为,使其适用于自定义数据类型。换句话说,我们可以通过重载运算符来定义两个对象之间的操作,使其具有更直观且符合实际需求的行为。

C++中支持对大部分运算符进行重载,包括算术运算符、比较运算符、位运算符(如 &、|、^)等等。通过运算符重载,我们可以扩展这些运算符的用法,使其适用于我们自定义的数据类型

介绍运算符重载

运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

所以运算符重载是通过函数重载的方式来实现的,其中函数名为运算符的符号。运算符重载函数可以是类的成员函数或友元函数。下面是运算符重载函数的一般形式:

返回值类型 operator运算符 (参数列表) {// 运算符的实现
}

在这里插入图片描述在运算符重载函数中,参数列表指定了参与运算的操作数。返回值类型通常为该类类型的引用或对象,以支持连续运算。

需要注意的是,不是所有的运算符都可以被重载,.* :: sizeof ?: . 注意以上5个运算符不能重载。而且在重载运算符时,也需要遵循一些规则和约束条件。例如,运算符的优先级和结合性不能改变,某些运算符(如赋值运算符)应该返回左操作数的引用,等等。

赋值运算符重载

赋值运算符是C++中最常用的运算符之一,它用于将一个对象的值赋给另一个对象。在C++中,我们可以通过重载赋值运算符来定义自定义数据类型的赋值操作,使其适用于我们自己定义的数据类型。

我们已经知道了运算符重载的格式,看代码示例:

class MyClass {
public:MyClass& operator=(const MyClass& other){// 赋值操作的实现return *this;}
};

在上面的代码中,我们定义了一个MyClass类,并重载了赋值运算符。注意到返回的是一个 指向当前对象的引用即*this),这是为了支持连续赋值操作。在重载函数中,我们接收一个指向另一个MyClass对象的引用,并将其值赋给当前对象。最后返回一个指向当前对象的引用。

赋值运算符(即=)是用于对象之间的赋值操作。它的重载允许我们定义自定义对象之间的赋值行为。在C++中,赋值运算符可以重载为类的成员函数,但不能重载为全局函数。

这是因为赋值运算符需要访问对象的私有成员变量,以便完成赋值操作。而成员函数具有隐含的this指针,可以直接访问对象的成员变量。因此,将赋值运算符重载为成员函数更加自然和方便。

在这里插入图片描述另一方面,全局函数无法直接访问类的私有成员变量。如果将赋值运算符重载为全局函数,那么它将无法直接访问类的私有成员变量,从而无法完成赋值操作。为了能够访问类的私有成员变量,我们需要使用友元函数或者友元类来实现。但是,这样做会破坏封装性,并且增加了复杂性。

综上所述,将赋值运算符重载为类的成员函数更加合理和方便,因为它可以直接访问类的私有成员变量,而全局函数无法直接访问类的私有成员变量。

赋值运算符如果不显式实现,编译器会生成一个默认的。此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数。

++运算符重载

重载运算符++有两种形式:前置递增和后置递增。

1. 前置++运算符重载:

// 前置递增运算符重载
ClassName& operator++()
{// 实现前置递增操作// 返回递增后的对象本身return *this;
}

在前置递增运算符重载中,操作符函数不需要任何参数。它直接对被操作对象进行递增操作,并返回递增后的对象本身。例如,可以通过以下方式使用前置递增运算符重载:

ClassName obj;
++obj; // 调用前置递增运算符重载函数

2. 后置++运算符重载::

// 后置递增运算符重载
ClassName operator++(int)
{// 创建一个副本用于保存递增前的对象状态ClassName temp = *this;// 实现递增操作// 更新当前对象的状态// 返回递增前的对象副本return temp;
}

在后置递增运算符重载中,操作符函数需要一个额外的int参数(虽然该参数不会被实际使用)。它首先创建一个副本用于保存递增前的对象状态,然后对当前对象进行递增操作,并返回递增前的对象副本。但是在调用函数时该参数不用传递,编译器自动传递
例如,可以通过以下方式使用后置递增运算符重载:

ClassName obj;
obj++; // 调用后置递增运算符重载函数

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

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

相关文章

BikeDNA(四)初始化参考数据

BikeDNA(四)初始化参考数据 这本笔记本: 加载定义研究区域的多边形,然后为研究区域创建网格叠加。加载参考数据。处理参考数据以创建分析所需的网络结构和属性。 先决条件和条件 输入/输出 config.yml 必须提前设置。 此笔记本…

解决文字识别中误识别问题的秘籍

随着人工智能技术的不断发展,文字识别技术已经广泛应用于各个领域,如智能客服、智能家居、自动驾驶等。然而,在实际应用中,文字识别技术也面临着误识别的问题。误识别不仅会影响用户体验,还可能导致严重的后果。因此&a…

CSAPP - 反汇编 strings_not_equal

CSAPP - 反汇编 strings_not_equal CSAPP bomlab1 中涉及到的 strings_not_equal 函数, 虽然可以从函数名字猜出函数含义,但我想根据汇编代码反推出对应的C代码,而不是根据函数名字猜测。 相比于专门学习 CTF 的选手, 本篇的废话很多&#…

怎么把PDF转成图片格式?分享一个PDF转图片的方法

在数字时代,PDF文件已经成为我们日常工作中不可或缺的一部分。然而,有时候我们需要将PDF文件中的内容转换为图片格式,这涉及到将PDF转图片的需求。PDF转图片的需求来源于不同的应用场景。在某些情况下,我们需要将PDF文件中的内容以…

openssl3.2 - 官方demo学习 - cipher - aesccm.c

文章目录 openssl3.2 - 官方demo学习 - cipher - aesccm.c概述笔记END openssl3.2 - 官方demo学习 - cipher - aesccm.c 概述 aesccm.c 是 AES-192-CCM 的加解密应用例子, 用的EVP接口. 看到不仅仅要用到key, iv, data, 在此之前还要设置 nonce, tag, 认证数据. 为啥需要设置…

TensorRT量化

系列文章目录 第一章 YOLOv5模型训练集标注、训练流程 第二章 YOLOv5模型转ONNX,ONNX转TensorRT Engine 第三章 TensorRT量化 文章目录 系列文章目录前言一、量化二、量化在TensorRT中的实现三、预处理(Preprocess)和后处理(Postprocess)总结 前言 学习笔记–恩培…

linuxshell日常脚本命令(1)

Linux 清理make、configure生成的文件(灵感来自于quilt安装) make clean #make clean 可以清除make失败的内容Linux 清理make、configure生成的文件 make clean #清除上一次make命令生成的文件 make distclean #清除上一次make以及configure命令生成的…

【MATLAB】 多元变分模态分解MVMD信号分解算法

有意向获取代码,请转文末观看代码获取方式~ 1 基本定义 多元变分模态分解(MVMD)是一种信号分解方法,可以自适应地实现信号的频域剖分及各分量的有效分离。 MVMD算法的具体步骤如下: 假设原始信号S被分解为K个分量μ…

代码随想录 Leetcode160. 相交链表

题目: 代码(首刷看解析 2024年1月13日): class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode *A headA, *B headB;while (A ! B) {A A ! nullptr ? A->next : headB;B B ! nullpt…

【力扣·每日一题】2182.构造限制重复的字符串(模拟 贪心 优先队列 C++ Go)

题目链接 题意 给你一个字符串 s 和一个整数 repeatLimit ,用 s 中的字符构造一个新字符串 repeatLimitedString ,使任何字母 连续 出现的次数都不超过 repeatLimit 次。你不必使用 s 中的全部字符。 返回 字典序最大的 repeatLimitedString 。 如果…

[易语言]易语言部署yolox的onnx模型

【官方框架地址】 https://github.com/Megvii-BaseDetection/YOLOX 【算法介绍】 YOLOX是YOLO系列目标检测算法的进一步演变和优化。它由Megvii Technology的研究团队开发,是一个高性能、可扩展的对象检测器。YOLOX在保留快速处理速度的同时,通过引入一…

textarea文本框根据输入内容自动适应高度

第一种&#xff1a; <el-input auto-completeoff typetextarea :autosize"{minRows:3,maxRows:10}" class"no-scroll"> </el-input> /* 页面的样式表 */ .no-scroll textarea {overflow: hidden; /* 禁用滚动条 */resize: none; /* 禁止用户…

NetApp E系列(E-Series)OEM产品介绍以及如何收集日志和保存配置信息

NetApp E系列是NetApp收购LSI存储后建立的一条新的产品线&#xff0c;由于LSI存储的历史悠久&#xff0c;所以这条产品线给NetApp带来了很多的OEM产品&#xff0c;可以说E系列是世界上OEM给最多公司的存储产品线也不为过&#xff0c;因为最早LSI的产品销售测率就是OEM&#xff…

2024.1.9 Spark SQL day06 homework,数据清洗

目录 一. Spark SQL中数据清洗的API有哪些&#xff0c;各自作用是什么&#xff1f; 二. 设置Spark SQL的shuffle分区数的方式有哪几种 三. 数据写出到数据库需要注意什么? 四. Spark程序运行集群分类 一. Spark SQL中数据清洗的API有哪些&#xff0c;各自作用是什么&#x…

JQuery过滤选择器-如何让某个元素换颜色(俩种方式)

目录 一、过滤选择器&#xff1a;eq二、过滤选择器 : lt 前言 : 在做项目时经常会遇到列表或者选择某个元素 一、过滤选择器&#xff1a;eq :eq (index)匹配一个给定索引值的元素 $("ul li:eq(0)").css("color","red");二、过滤选择器 : lt …

2024-01-11 部署Stable Diffusion遇挫记

点击 <C 语言编程核心突破> 快速C语言入门 部署Stable Diffusion遇挫记 前言一、一如既往的GitHub部署二、使用的感受总结 create by Stable Diffusion; prompt: fire water llama 前言 要解决问题: 由于近期的努力, 已经实现语音转文字模型, 通用chat迷你大模型的本地…

怎么把workspace的数据导入到simulink进行FFT分析?

怎么把数据导入到simulink在这篇博客已经阐述了&#xff0c;那么如何把数据导入到simulink还能进行FFT分析呢&#xff1f; 首先我们看simulink的FFT分析界面&#xff0c;&#xff08;前置步骤&#xff1a;导入powergui模块&#xff0c;双击powergui模块&#xff0c;Tool选项卡…

使用curl发送时间参数

# 获取当前日期 current_date$(date %Y-%m-%d)# 获取前一天的0点和23:59:59的时间&#xff0c;并格式化为yyyy-MM-dd 24hh:mm:ss begin_time$(date -d "yesterday 00:00:00" %Y-%m-%d\ %H:%M:%S) end_time$(date -d "yesterday 23:59:59" %Y-%m-%d\ %H:%M:…

发动机装备3d虚拟在线云展馆360度展示每处细节

在当今数字化的时代&#xff0c;消费者对于线上购物的需求与期待日益增长。尤其在购车这一大宗消费行为上&#xff0c;消费者不再满足于传统的图片与文字介绍。为了满足这一市场需求&#xff0c;我们引入了3D线上展示技术。 3D汽车模型实景互动展示是一种通过先进的三维建模技术…

【密码学】python密码学库pycryptodome

记录了一本几乎是10年前的书&#xff08;python绝技–用python成为顶级黑客&#xff09;中过时的内容 p20 UNIX口令破解机 里面提到了python标准库中自带的crypt库&#xff0c;经验证Python 3.12.1中并没有这个自带的库&#xff0c;密码学相关的库目前&#xff08;2024.1.12&a…