【C++】- 类和对象(运算符重载!!const!!详解!!)

类和对象③

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

在这里插入图片描述在学习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++; // 调用后置递增运算符重载函数

可重载的运算符有很多种,本文只以++运算符和赋值运算符为例演示。

运算符重载是一种非常有用的编程技术,可以简化代码、提高可读性和灵活性。通过为自定义类型重载运算符,我们可以让它们具备与内置类型相似的行为,使得代码更加直观和易于理解。然而,在使用运算符重载时,我们应该注意不要滥用,合理使用才能发挥其优势。

const

在运算符重载中,const关键字的使用非常重要。它可以用于修饰运算符重载函数的参数和返回值,以确保其不会修改对象的状态。

一般情况下,const大致有两种用法:

  1. 修饰参数:
    在运算符重载函数中,如果参数是类的成员变量,并且不需要修改其值,可以将参数声明为const引用。这样可以避免不必要的复制操作,并且告诉编译器该函数不会修改参数的值。

例如,在向量类的加法运算符重载函数中,我们可以将参数声明为const引用:

Vector operator+(const Vector& other) const {// ...
}

这样做可以避免对other对象进行复制,并且明确表示该函数不会修改other对象的值。

  1. 修饰返回值:
    如果运算符重载函数返回的是一个临时对象,并且不希望其被修改,可以将返回值声明为const。这样可以防止对返回值进行非法的修改操作。用const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

    在这里插入图片描述
    这样做可以确保返回的临时对象不会被修改。

总之,使用const关键字可以增加代码的可读性和安全性,尤其在运算符重载中更为重要。它可以提醒开发者该函数不会修改对象的状态,并且可以防止对const修饰的参数和返回值进行非法的修改操作。因此,在编写运算符重载函数时,应该根据实际情况合理地使用const关键字。

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

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

相关文章

WEB 3D技术 three.js 3D贺卡(2) 加入天空与水面效果

上文 WEB 3D技术 three.js 3D贺卡(1) 搭建基本项目环境 我们简单搭了一个贺卡雏形 然后 我们要引入一个hdr的一个天空的效果 所以 我们需要在代码中导入 RGBELoader //导入 RGBELoader hdr工具 import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader"…

文件加密怎么设置?文件工具哪个好用?

在使用电脑时,我们可以通过加密来保护电脑中的重要文件,那么,文件加密要怎么设置呢?下面我们就来了解一下。 文件夹加密超级大师 作为“加密大师”,文件夹加密超级大师支持文件加密功能,并提供了金钻加密和…

使用 Picocli 开发 Java 命令行,5 分钟上手

大家好,我是鱼皮,对不会前端的同学来说,开发 命令行工具 是一种不错的展示系统功能的方式。在 Java 中开发命令行工具也很简单,使用框架,几分钟就能学会啦~ Picocli 入门 Picocli 是 Java 中个人认为功能最完善、最简单…

[ PyQt入门教程 ] Qt Designer工具的使用

Qt Designer是PyQt程序UI界面的实现工具,使用Qt Designer可以拖拽、点击完成GUI界面设计,并且设计完成的.ui程序可以转换成.py文件供python程序调用。本文主要通过用户登录需求描述Qt Designer工具开发界面的使用方法。 主要内容 1、Qt Designer程序主界…

从濒临破产到玩具行业天花板,乐高怎么做到的?

成立于1932年的乐高一开始只是儿童玩具,到现在也俘获了许多大人的心,然而在2003年乐高遇到了巨大的经营危机,离破产只有一一步之遥,然而在当下,乐高已经成功跻身世界500强。今天媒介盒子就来和大家聊聊:从濒…

Server/PC 稳定性测试(Windows)

Server/PC 稳定性测试 1. CPU - 中央处理器1.1 CPU稳定性1.2 CPU温度 2. Memory - 内存2.1 内存性能 3. DISK - 硬盘3.1 HDD - 机械硬盘机械硬盘转速详解监测工具 3.2 SSD - 固态硬盘监测工具 4. 使用时长cpu能用多久?主板能用多久?内存能用多久&#xf…

第二篇:新建node项目并运行

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 安装 Node.js:首先,确保你的…

【Java】后端开发语言Java和C#,两者对比注解和属性的区别以及作用

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握…

抖音SEO搜索排名优化培训教程课件

【干货资料持续更新,以防走丢】 抖音SEO搜索排名优化培训教程课件 部分资料预览 资料部分是网络整理,仅供学习参考。 抖音运营资料合集 (完整资料包含以下内容) 目录 抖音易爆单的商品特征 抖音作为一款短视频平台,…

【应用方案】基于MT7628 JN5169 和SUN724的4G-Zigbee智能网关方案

产品方案特性 - 4G-Zigbee智能网关扩展性强; - 百兆以太网接入; - 支持Zigbee 3.0智能家居产品和智能安防产品接入; - 实时检测烟感、气感,联动阀门控制器可自动关闭燃气阀门,并拨打报警电话,防止火灾&…

静态住宅代理与动态住宅代理的区别?如何选?

住宅代理ip分类两种类型:静态住宅代理和动态住宅代理,他们有什么区别又能用在什么场景呢?我们先从他们是如何运作开始。 一、什么是住宅代理ip isp住宅代理ip我们称为真人住宅代理,地址是从真人/家庭中出发,安全性更高…

游戏素材永不缺,免费在线AI工具Scenario功能齐全,简单易用

Scenario是一个在线的AI驱动的工具,主要用于游戏艺术创作。它提供了一套全面的功能,旨在帮助游戏开发者创建与其独特风格和艺术方向相符的独特、高质量的游戏艺术。Scenario的突出特点之一是它的微调能力,允许用户根据独特的风格和艺术方向训…

Qt单个字符判断

1.相关说明 字符的Unicode编码、单个字符的判断 2.界面绘制 3.相关主要代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui;…

【AIGC入门一】Transformers 模型结构详解及代码解析

Transformers 开启了NLP一个新时代,注意力模块目前各类大模型的重要结构。作为刚入门LLM的新手,怎么能不感受一下这个“变形金刚的魅力”呢? 目录 Transformers ——Attention is all You Need 背景介绍 模型结构 位置编码 代码实现&…

Agent检索增强生成

检索增强生成(RAG)设计模式通常用于在特定数据域中开发大语言模型(LLM)应用。然而,RAG的过往的研究重点主要在于提高检索工具的效率,例如嵌入搜索、混合搜索和微调嵌入,而忽视了智能搜索。本文介绍了一种受人类研究方法启发的新方法&#xff…

for循环判断有几个偶数

num100 count0 for i in range(1,num):if i%20:print("为偶数")count1 print(f"1-100的范围内,有{count}个偶数") 运行结果如下:

代码随想录Day21 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

代码随想录Day21 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先 二叉搜索树的最小绝对差二叉搜索树中的众数二叉树的最近公共祖先 二叉搜索树的最小绝对差 文档讲解:代码随想录 视频讲解: 二叉搜索树中,需…

使用免费敏捷工具Leangoo领歌管理Sprint Backlog

什么是Sprint Backlog? Sprint Backlog是Scrum的主要工件之一。在Scrum中,团队按照迭代的方式工作,每个迭代称为一个Sprint。在Sprint开始之前,PO会准备好产品Backlog,准备好的产品Backlog应该是经过梳理、估算和优先…

C语言编译链接

1.翻译环境和运⾏环境 在ANSI C的任何⼀种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执⾏的机器指令。 第2种是执⾏环境,它⽤于实际执⾏代码。 2. 翻译环境 翻译环境是由编译和链接两个⼤的过程组成的&…

Spring环境搭配

概述 Spring 是一个开源框架,Spring 是于2003 年兴起的一个轻量级的Java 开发框架,由 RodJohnson 在其著作 Expert One-On-One J2EE Development and Design 中阐述的部分理念和原型衍生而来。它是 为了解决企业应用开发的复杂性而创建的。框架的主要优势…