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

news2024/9/27 15:22:35

类和对象③

  • 介绍运算符重载
  • 赋值运算符重载
  • ++运算符重载
  • 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.coloradmin.cn/o/1379817.html

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

相关文章

8.云原生存储之Ceph集群

1. 私有云实战之基础环境搭建 2. 云原生实战之kubesphere搭建 3.云原生之kubesphere运维 4. 云原生之kubesphere基础服务搭建 5.云原生安全之kubesphere应用网关配置域名TLS证书 6.云原生之DevOps和CICD 7.云原生之jenkins集成SonarQube 8.云原生存储之Ceph集群 文章目录 为什么…

Linux 内核学习 3a - 如何查看虚拟内存和物理内存,以及虚拟内存和物理内存之间转换

/proc/iomem, ioremap(), mmap() The kernel manages device resources like registers as physical addresses(物理地址). These are the addresses in /proc/iomem. The physical address is not directly useful to a driver; it must use ioremap() to map the space and …

出租车费 C语言xdoj697

问题描述 某城市普通出租车计费标准如下: 起步里程为 3 公里,起步费 10 元; 超起步里程后 10 公里内,每公里 2 元; 超过 10 公里以上的部分,每公里加收 50%的回空补贴费; 营运过程中&#xff0c…

若依基于jsencrypt实现前后端登录密码加密

若依虽然有加密解密功能,然后只有前端有,在用户点击保存密码的时候,会将密码保存到本地,但是为了防止密码泄露,所以在保存的时候,进行加密,在回显密码的时候进行解密显示,用户在登录…

【iOS】数据持久化(四)之FMDB基本使用

正如我们前面所看到的,原生SQLite API在使用时还是比较麻烦的,于是,开源社区就出现了一系列将SQLite API进行封装的库,其中FMDB的被大多数人所使用 FMDB和SQLite相比较,SQLite比较原始,操作比较复杂&#…

AI副业拆解:人像卡通化,赋予你的形象全新生命力

大家好我是在看,记录普通人学习探索AI之路。 🔥让你的形象瞬间穿越二次元!🚀人像卡通化,捕捉你的独特魅力,让真实与梦幻在此刻交融。🎨 今天为大家介绍如何免费把人像卡通化--漫画风 https://w…

关系型数据库和MySQL概述

关系型数据库概述 数据持久化 - 将数据保存到能够长久保存数据的存储介质中,在掉电的情况下数据也不会丢失。数据库发展史 - 网状数据库、层次数据库、关系数据库、NoSQL 数据库、NewSQL 数据库。1970年,IBM的研究员E.F.Codd在_Communication of the ACM_上发表了名为_A Rela…

PyCharm连接服务器(利用PyCharm实现远程开发)

利用PyCharm实现远程开发 注:该功能只有在PyCharm专业版下才可以使用,并且必须是官方的正版许可,破解版的是不可以使用的!!!可以通过免费教育许可申请使用权限(申请流程)。 pycharm…

【算法分析与设计】最短路径和

题目: 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例: 示例 1: 输入:grid [[1,3,1],…

基于JAVA开发的数字化智慧工地管理平台源码,可私有化部署、带可视化大屏

智能工地应用价值 智慧工地现场构建了基于物联网的智能化数据传感器通用的管理平台。利用计算机、人工智能、无线通信,全天候现场监视、施工检查、质量管理、服务,提高数字化管理、安全、绿色、施工等现场管理能力,标志着现场管理进入信息化时…

Mysql如何优化慢查询

如何优化慢查询 慢 SQL 的优化,主要从两个方面考虑,SQL 语句本身的优化,以及数据库设计的优化。 1、避免不必要的列 覆盖索引会导致回表,且增大了IO 2、分页优化 深分页解决方案 使用子查询in 使用连接表 left join 使用游标&a…

IDEA新建SpringBoot工程时java版本只有17和21

解决方法:替换源 参考博客:https://www.kuazhi.com/post/712799571.html

C#编程-实现重写

实现重写 实现派生类中基类的成员称为重写。在C#中,可以重写方法、属性和索引器。 重写是多态性的一种形式,因为它使您能够创建具有相同名称和不同功能的不同代码块。 重写函数 在面向对象编程中,子类可以提供超类中已定义的专门版本的函数。这称为函数重写。 函数重写是…

ASP.NET作业批改系统源码

ASP.NET作业批改系统源码 源码描述: 该系统主要完成学生注册,登陆,作业的上传,教师对作业进行发布,批改等功能。 包括登陆子系统,学生子系统,教师子系统和管理员子系统。 管理员功能 资料管理:修…

网络安全B模块(笔记详解)- 隐藏信息探索

隐藏信息探索 1.访问服务器的FTP服务,下载图片QR,从图片中获取flag,并将flag提交; ​ 通过windows电脑自带的图片编辑工具画图将打乱的二维码分割成四个部分,然后将四个部分通过旋转、移动拼接成正确的二维码 ​ 使用二维码扫描工具CQR.exe扫描该二维码 ​ 获得一串…

c++临时对象的探讨及相关性能提升

产生临时对象的情况 我们定义一个类进行测试 class tempVal { public:int v1, v2;tempVal(int v1 0, int v2 0);tempVal(const tempVal& t) :v1(t.v1), v2(t.v2) {cout << "调用拷贝构造函数" << endl;}virtual ~tempVal() {cout << "…

14、强化学习Soft Actor-Critic算法:推导、理解与实战

基于LunarLander登陆器的Soft Actor-Critic强化学习&#xff08;含PYTHON工程&#xff09; Soft Actor-Critic算法是截至目前的T0级别的算法了&#xff0c;当前正在学习&#xff0c;在此记录一下下。 其他算法&#xff1a; 07、基于LunarLander登陆器的DQN强化学习案例&#…

第二百六十三回 给geolocator插件提交问题

文章目录 1. 知识回顾2. 问题描述与解决2.1 问题描述2.2 问题解决 3. 心得与感受 1. 知识回顾 我们在前面章回中介绍过如何获取位置信息&#xff0c;主要介绍的是geolocator这个三方包&#xff0c;不过在最近使用时却发现了问题&#xff0c;尝试搜索解决&#xff0c;但是没有结…

影像组学介绍

影像组学介绍 1 影像组学介绍2 具体提取影像组学方法流程及工具代码&#xff1a;2.1 影像数据获取2.2 感兴趣区域分割2.3 特征提取与降维选择2.3.1 特征提取&#xff1a;2.3.2 特征降维(特征选择) 2.4 建模分析&#xff1a;2.5 结果分析 参考&#xff1a; 1 影像组学介绍 其实…

7个向量数据库对比:Milvus、Pinecone、Vespa、Weaviate、Vald、GSI 和 Qdrant

本文简要总结了当今市场上正在积极开发的7个向量数据库&#xff0c;Milvus、Pinecone、Vespa、Weaviate、Vald、GSI 和 Qdrant 的详细比较。 我们已经接近在搜索引擎体验的基础层面上涉及机器学习&#xff1a;在多维多模态空间中编码对象。这与传统的关键字查找不同&#xff08…