【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++; // 调用后置递增运算符重载函数

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux中PyTorch的安装教程

在安装PyTorch之前,我们需要确保已经安装了Python和pip。可以使用以下命令检查是否已经安装: python --version pip --version如果没有安装,可以使用以下命令安装: sudo apt-get update sudo apt-get install python3 sudo apt-…

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

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

手把手教你学会接口自动化系列九-封装调用之后的代码展示

接上篇: 手把手教你学会接口自动化系列八-将url写在配置文件中,封装调用-CSDN博客 下来把之前写的demo开始改造,将所有的url = http://192.168.0.134:8081的部分,替代了 如下: demo的改造 # !/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2023/05# @Author …

OpenCV-Python的版本介绍及区别

OpenCV-Python版本介绍 OpenCV-Python有多个版本,每个版本都有其特定的功能和改进。以下是一些常见OpenCV-Python版本及其介绍和区别: OpenCV-Python 2.x版本 这是OpenCV-Python的旧版本,支持Python 2.x。它包含了许多传统的计算机视觉功能&…

Springboot + vue 停车管理系统

Springboot vue 停车管理系统 项目描述 系统包含用户和管理员两个角色 用户:登录、注册、个人中心、预定停车位、缴费信息 管理员:登录、用户信息管理、车位信息管理、车位费用管理、停泊车辆管理、车辆进出管理、登录日志查询 运行环境 jdk1.8 idea …

强化学习应用(五):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法,用于解决基于马尔可夫决策过程(MDP)的问题。它通过学习一个价值函数来指导智能体在环境中做出决策,以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

C++编码规范:JSF-AV(未完待续)

联合打击战斗机计划(英语:Joint Strike Fighter Program,简称JSF)是一个由美国和其盟国发起的新一代战斗机发展和采购项目。该项目旨在取代大量已老化的战斗机、战斗轰炸机和攻击机。该项目计划在未来取代各种西方主力战机&#x…

Web3的应用发展及其影响

Web3,又被称为去中心化Web,是互联网发展的一个阶段,其核心特点是数据的去中心化和用户自主权。近年来,随着区块链技术的不断成熟,Web3的应用也得到了广泛的关注和发展。在这篇文章中,我们将深入探讨Web3目前…

一文了解2024年AMC8竞赛模拟考试安排的重点和注意事项(附资源)

各位报名参加2024年AMC8竞赛的家长和孩子们注意了!今天到明天就可以参加AMC8竞赛的模拟考试了,本文结合本次模拟考试的常见问题为大家进行了梳理,站在参赛者的角度把2024年AMC8的模拟考试的关键事项和要点说清楚,让您最准确、快速…

JUC02同步和锁

同步&锁 相关笔记:www.zgtsky.top 临界区 临界资源:一次仅允许一个进程使用的资源成为临界资源 临界区:访问临界资源的代码块 竞态条件:多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测&am…

... * Images are published to: /custom_ns/custom_camera/custo ...

using yaml rules: yaml.safe_load() failed mapping values are not allowed herein "<unicode string>", line 205, column 42:... * Images are published to: /custom_ns/custom_camera/custo ... 说出来有点不信&#xff0c;居然是这个注释可能不安…

Flink定制化功能开发,demo代码

前言&#xff1a; 这是一个Flink自定义开发的基础教学。本文将通过flink的DataStream模块API&#xff0c;以kafka为数据源&#xff0c;构建一个基础测试环境&#xff1b;包含一个kafka生产者线程工具&#xff0c;一个自定义FilterFunction算子&#xff0c;一个自定义MapFunctio…

Spring Boot - Application Events 的发布顺序_ApplicationReadyEvent

文章目录 Pre概述Code源码分析 Pre Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent 概述 Spring Boot 的广播机制是基于观察者模式实现的&#xff0c;它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#…

每日一练:LeeCode-111. 二叉树的最小深度【二叉树】

本文是力扣LeeCode-111. 二叉树的最小深度 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子…

Java异常处理--异常处理的方式1:try-catch-finally

文章目录 一、异常处理概述二、方式1&#xff1a;捕获异常&#xff08;try-catch-finally&#xff09;&#xff08;1&#xff09;抓抛模型&#xff08;2&#xff09;try-catch-finally基本格式1、基本语法2、整体执行过程3、try和catch3.1 try3.2 catch (Exceptiontype e) &…

掌握 gRPC 和 RPC 的关键区别

一、远程过程调用协议简介 1、RPC 的本质 首先&#xff0c;我们探讨一下什么是 RPC。RPC&#xff0c;缩写为 Remote Procedure Call Protocol&#xff0c;直译来看就是远程过程调用协议。 讲得通俗一些&#xff1a; RPC 是一种通信机制RPC 实现了客户端/服务器通信模型 官…

【数据集处理】FFHQ如何进行人脸对齐,Aligned and cropped images at 1024×1024

什么是人脸对齐&#xff1f; 人脸对齐是一种图像处理技术&#xff0c;旨在将图像中的人脸部分对齐到一个标准位置或形状。在许多情况下&#xff0c;这通常涉及将眼睛、鼻子和嘴巴等关键点对齐到特定的位置。通过这种方式&#xff0c;所有的人脸图像可以有一个一致的方向和尺寸…

【JVM的相关参数和调优】

文章目录 JVM 调优的参数类型一、标配参数二、X参数三、XX参数 JVM 调优的常用参数 JVM 调优的参数类型 一、标配参数 这类此参数在jdk的各个版本之间很少会变化&#xff0c;基本不改变 java -version&#xff0c;查看当前电脑上的jdk的版本信息 java -help&#xff0c;查看…

阴盘奇门八字排盘马星位置计算方法php代码

如下位置&#xff0c;马星的四个位置。 计算方法&#xff1a; 1。先根据出生年月日&#xff0c;计算得八字四柱。比如 2024年01月09日&#xff0c;四柱为 其中时柱地支为“申” 2。然后根据以下对应的数组&#xff0c;来找到id号&#xff0c;即马星位置。 根据下表来找到&am…

开机自启动android app

Android App开机自启动_android 开机自启动-CSDN博客 注意权限问题&#xff1a; 第二种实现方式&#xff1a;系统桌面应用 问&#xff1a;android的系统桌面应用启动是什么&#xff1a; 答&#xff1a; Android 系统桌面应用是指用户在设备主屏幕上看到的默认启动界面&…