【C++】运算符重载 ⑫ ( 等于判断 == 运算符重载 | 不等于判断 != 运算符重载 | 完整代码示例 )

news2024/11/27 20:58:34

文章目录

  • 一、数组类 等号 = 运算符重载
    • 1、等于判断 == 运算符重载
    • 2、不等于判断 != 运算符重载
  • 二、完整代码示例
    • 1、Array.h 数组头文件
    • 2、Array.cpp 数组实现类
    • 3、Test.cpp 测试类
    • 4、执行结果





一、数组类 等号 = 运算符重载




1、等于判断 == 运算符重载


使用 成员函数 实现 等于判断 == 运算符重载 :

  • 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 ,
    • 要对 Array a , b 对象对比操作 , 使用 == 运算符 , 使用时用法为 a == b ;
    • 函数名是 operate== ;
operate==
  • 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
    • 要对 Array a , b 对象对比操作 , 使用 == 运算符 , 使用时用法为 a == b ;
    • 左操作数 : 其中 左操作数 是 Array a , 这里通过 this 指针调用 , 不需要声明在参数中 ;
    • 右操作数 : 右操作数 是 Array b ; 该操作数需要声明在参数中 , 注意需要声明 引用类型 ;
    • 上述两个是对象类型 , 对象一般传入 指针 或 引用 , 这里传入引用类型 ;
operator==(Array& a)
  • 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;
    • 此处返回值是 bool 类型 , 返回 true 或者 false 布尔值即可 ;
bool operator==(Array& a)
  • 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
    • 先对比数组的长度是否相等 ;
    • 然后对比数组中每个元素是否相等 ;
// 等于判断 == 运算符重载
bool Array::operator==(Array& a)
{
	// 首先判断数组长度是否相等
	if (this->m_length != a.m_length)
	{
		return false;
	}

	for (size_t i = 0; i < this->m_length; i++)
	{
		// 只要有一个元素不相等, 整个数组就不相等
		if (this->m_space[i] != a.m_space[i])
		{
			return false;
		}
	}
	return true;
}

2、不等于判断 != 运算符重载


使用 成员函数 实现 不等于判断 != 运算符重载 :

  • 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 ,
    • 要对 Array a , b 对象对比操作 , 使用 != 运算符 , 使用时用法为 a != b ;
    • 函数名是 operate!= ;
operate!=
  • 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
    • 要对 Array a , b 对象对比操作 , 使用 != 运算符 , 使用时用法为 a != b ;
    • 左操作数 : 其中 左操作数 是 Array a , 这里通过 this 指针调用 , 不需要声明在参数中 ;
    • 右操作数 : 右操作数 是 Array b ; 该操作数需要声明在参数中 , 注意需要声明 引用类型 ;
    • 上述两个是对象类型 , 对象一般传入 指针 或 引用 , 这里传入引用类型 ;
operator!=(Array& a)
  • 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;
    • 此处返回值是 bool 类型 , 返回 true 或者 false 布尔值即可 ;
bool operator!=(Array& a)
  • 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
    • 先对比数组的长度是否不相等 ;
    • 然后对比数组中每个元素是否不相等 ;
// 不等于判断 != 运算符重载
bool Array::operator!=(Array& a)
{
	// 首先判断数组长度是否相等
	if (this->m_length != a.m_length)
	{
		return true;
	}

	for (size_t i = 0; i < this->m_length; i++)
	{
		// 只要有一个元素不相等, 整个数组就不相等
		if (this->m_space[i] != a.m_space[i])
		{
			return true;
		}
	}
	return false;
}




二、完整代码示例




1、Array.h 数组头文件


#pragma once

#include "iostream"
using namespace std;

class Array
{
public:
	// 无参构造函数
	Array();

	// 有参构造函数
	Array(int len);

	// 拷贝构造函数
	Array(const Array& array);

	// 析构函数
	~Array();

public:
	// 设置数组数据
	void setData(int index, int value);

	// 获取数组数据
	int getData(int index);

	// 获取数组长度
	int length();

public:
	// 数组下标 [] 操作符重载
	int& operator[](int i);

	// 等号 = 操作符重载
	Array& operator=(Array& a);

	// 等于判断 == 运算符重载
	bool operator==(Array& a);

	// 不等于判断 != 运算符重载
	bool operator!=(Array& a);

private:
	// 数组长度
	int m_length;

	// 指向数组数据内存 的指针
	int* m_space;
};

2、Array.cpp 数组实现类


#include "Array.h"

// 无参构造函数
Array::Array()
{
	// 设置数组长度
	m_length = 10;

	// 为数组在堆内存中分配内存
	m_space = new int[m_length];

	cout << " 调用无参构造函数 " << endl;
}

// 有参构造函数
Array::Array(int len)
{
	// 设置数组长度
	m_length = len;

	// 为数组在堆内存中分配内存
	m_space = new int[m_length];

	cout << " 调用有参构造函数 " << endl;
}

// 拷贝构造函数
// 这是一个深拷贝 拷贝构造函数
Array::Array(const Array& array)
{
	// 设置数组长度
	m_length = array.m_length;

	// 创建数组
	m_space = new int[m_length];

	// 为数组赋值
	for (int i = 0; i < m_length; i++)
	{
		m_space[i] = array.m_space[i];
	}

	cout << " 调用拷贝构造函数 " << endl;
}

// 析构函数
Array::~Array()
{
	if (m_space != NULL)
	{
		// 释放 new int[m_length] 分配的内存 
		delete[] m_space;
		m_space = NULL;
	}

	cout << " 调用析构函数 " << endl;
}

// 设置数组数据
void Array::setData(int index, int value)
{
	m_space[index] = value;
}

// 获取数组数据
int Array::getData(int index)
{
	return m_space[index];
}

// 获取数组长度
int Array::length()
{
	return m_length;
}

// 数组下标 [] 操作符重载
int& Array::operator[](int i)
{
	return m_space[i];
}

// 等号 = 操作符重载
Array& Array::operator=(Array& a)
{
	if (this->m_space != NULL)
	{
		// 释放 new int[m_length] 分配的内存 
		delete[] this->m_space;
		this->m_space = NULL;
	}

	// 设置数组长度
	this->m_length = a.m_length;

	// 创建数组
	this->m_space = new int[m_length];

	// 为数组赋值
	for (int i = 0; i < m_length; i++)
	{
		this->m_space[i] = a.m_space[i];
	}

	cout << " 调用 等号 = 操作符重载 函数" << endl;

	// 返回是引用类型
	// 返回引用就是返回本身
	// 将 this 指针解引用, 即可获取数组本身
	return *this;
}

// 等于判断 == 运算符重载
bool Array::operator==(Array& a)
{
	// 首先判断数组长度是否相等
	if (this->m_length != a.m_length)
	{
		return false;
	}

	for (size_t i = 0; i < this->m_length; i++)
	{
		// 只要有一个元素不相等, 整个数组就不相等
		if (this->m_space[i] != a.m_space[i])
		{
			return false;
		}
	}
	return true;
}

// 不等于判断 != 运算符重载
bool Array::operator!=(Array& a)
{
	// 首先判断数组长度是否相等
	if (this->m_length != a.m_length)
	{
		return true;
	}

	for (size_t i = 0; i < this->m_length; i++)
	{
		// 只要有一个元素不相等, 整个数组就不相等
		if (this->m_space[i] != a.m_space[i])
		{
			return true;
		}
	}
	return false;
}

3、Test.cpp 测试类


#include "iostream"
using namespace std;

#include "Array.h"

int main() {

	Array array(3);

	// 设置 array 数组值
	for (int i = 0; i < array.length(); i++)
	{
		//array.setData(i, i + 5);
		array[i] = i + 5;
	}

	// 打印 array 数组值
	for (int i = 0; i < array.length(); i++)
	{
		//cout << array.getData(i) << endl;
		cout << array[i] << endl;
	}

	// 使用拷贝构造函数 赋值
	Array array2(3);
	Array array3(3);

	// 调用重载的等号运算符
	array3 = array2 = array;

	// 打印 array2 数组值
	for (int i = 0; i < array3.length(); i++)
	{
		//cout << array3.getData(i) << endl;
		cout << array3[i] << endl;
	}

	// 打印 == 重载运算符 计算结果
	cout << "array == array3 : " << ( array == array3 ) << endl;

	// 打印 != 重载运算符 计算结果
	cout << "array != array3 : " << (array != array3) << endl;


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

4、执行结果


执行结果 :

 调用有参构造函数
5
6
7
 调用有参构造函数
 调用有参构造函数
 调用 等号 = 操作符重载 函数
 调用 等号 = 操作符重载 函数
5
6
7
array == array3 : 1
array != array3 : 0
Press any key to continue . . .

在这里插入图片描述

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

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

相关文章

盒子模型的基础

盒子模型 边框&#xff08;border&#xff09; border可以设置元素的边框&#xff0c;边框分成三部分&#xff0c;边框的&#xff08;粗细&#xff09;边框的样式&#xff0c;边框的颜色 <style>div {width: 100px;height: 100px;border-width: 200;border-style: 边框…

【运行时数据区和程序计数器】

文章目录 1. 运行时数据区2. 程序计数器(PC 寄存器) 1. 运行时数据区 当我们通过前面的&#xff1a;类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后&#xff0c;就会用到执行引擎对我们的类进行使用&#xff0c;同时执行引擎将会使用到我们运行时数据…

你了解的SpringCloud核心组件有哪些?他们各有什么作用?

SpringCloud 1.什么是 Spring cloud Spring Cloud 为最常见的分布式系统模式提供了一种简单且易于接受的编程模型&#xff0c;帮助开发人员构建有弹性的、可靠的、协调的应用程序。Spring Cloud 构建于 Spring Boot 之上&#xff0c;使得开发者很容易入手并快速应用于生产中。…

px4仿真实现无人机自主飞行

一,确定消息类型 无人机通过即在电脑是现自主飞行:思路如下。 通过Mavros功能包,将ROS消息转换为Mavlink消息。实现对无人机的控制。 几种消息之间的关系如下: 对于ROS数据,就是我们机载电脑执行ROS系统的数据。 对于Mavros消息,就是Mavros功能包内部的消息。查询网站…

【SkyWalking】SkyWalking是如何实现跨进程传播链路数据?

文章目录 一、简介1 为什么写这篇文章2 跨进程传播协议-简介 二、协议1 Standard Header项2 Extension Header项3 Correlation Header项 三、跨进程传播协议的源码分析1 OpenTracing规范2 通过dubbo插件分析跨进程数据传播3 分析跨进程传播协议的核心源码 四、小结参考 一、简介…

ERDAS 2022 安装教程

注意&#xff1a; 演示ERDAS版本为&#xff1a;2022.v16.7.0.1216 安装程序&#xff1a; 1、主程序&#xff1a;点击下载 2、许可文件&#xff1a;点击下载 3、IDM下载器&#xff1a;点击下载 下载速度&#xff1a; 浏览器下载速度慢&#xff0c;可以使用以上提供的IDM下…

[GWCTF 2019]我有一个数据库 phpMyAdmin 4.8.1后台文件包含漏洞

一开始打开是乱码 之前题目做过修复乱码的&#xff0c;得到这个 用dirsearch扫一下 一开始我是看到robots.txt 访问一下 访问一下phpinfo 也没啥&#xff0c;看到phpmyadimin 访问一下 没啥思路&#xff0c;看了wp 看到phpMyAdmin 4.8.1后台文件包含漏洞&#xff08;CV…

LabVIEW中不同颜色连线的含义

LabVIEW中不同颜色连线的含义 LabVIEW中的连线具有不同的颜色&#xff0c;样式和宽度。每个都代表了什么&#xff1f; 下表列出了常见的连线类型&#xff1a; 相关信息 请注意&#xff0c;类的连线颜色是可更改的。该表显示其默认外观。 连线用于在程序框图各对象间传递数据…

016 Spring Boot + Vue 图书管理系统

Spring Boot Vue 图书馆管理系统&#xff08;library-system&#xff09; 本地快捷预览项目 第一步&#xff1a;运行 db 文件夹下的springboot-vue.sql(询问作者获取)&#xff0c;创建springboot-vue数据库 第二步&#xff1a;修改后端数据库配置文件&#xff0c;启动后端 …

二次封装View Design的table组件,实现宽度自适应,内容在一行展示

由于table组件本身并不支持宽度自适应&#xff0c;但实际项目需要&#xff0c;而且多处有用到table组件&#xff0c;所以尝试着自己来二次封装一下组件 想法 刚开始的想法很简单&#xff0c;就是获取每一列中数据和标题在表格中的长度&#xff0c;然后将当中最大的长度作为该列…

Nginx配置文件的通用语法介绍

要是参考《Ubuntu 20.04使用源码安装nginx 1.14.0》安装nginx的话&#xff0c;nginx配置文件在/nginx/conf目录里边&#xff0c;/nginx/conf里边的配置文件结构如下图所示&#xff1a; nginx.conf是主配置文件&#xff0c;它是一个ascii文本文件。配置文件由指令&#xff08;…

分析“由于找不到vcruntime140.dll无法继续执行代码”这个问题的5个解决方法

当使用电脑时&#xff0c;我们难免会遇到各种问题。其中&#xff0c;“由于找不到vcruntime140.dll无法继续执行代码”是一个常见的错误&#xff0c;通常出现在运行使用C编写的应用程序时。这个问题可能会导致软件程序或游戏无法打开或运行。然而&#xff0c;只要我们掌握正确的…

大话机器学习准确率(Accuracy)、精确率(Pecision)、召回率(Recall)以及TP、FP、TN、FN

话说三国时期&#xff0c;乱世出人才&#xff0c;当时刘备让张飞帮忙招兵买马&#xff0c;寻找人才。张飞发公告以后&#xff0c;有10人来面试&#xff0c;这10人分为两类&#xff0c;人才和庸才&#xff0c;各占百分之五十&#xff0c;张飞的主要作用就是从这10人中识别出人才…

放大招,百度文心大模型4.0正在加紧训练,即将发布

插播一条快讯&#xff01; &#xfeff;&#xfeff;刚刚看到一篇报道&#xff0c;说百度正在加紧训练文心大模型4.0&#xff01;百度5月发布了文心大模型3.5&#xff0c;才4个多月又要发布4.0了&#xff0c;这迭代速度简直了。据说这次发布将在10月17日百度世界大会上进行&am…

strcat函数详解:字符串追加的利器

目录 一&#xff0c;strcat函数的简介 二&#xff0c;strcat函数的使用 三&#xff0c;strcat函数的注意事项 四&#xff0c;strcat函数的模拟实现 一&#xff0c;strcat函数的简介 strcat函数用于将源字符串追加到目标字符串的末尾&#xff0c;并返回一个指向目标字符串的…

QString、QLatin1String、QStringLiteral区别和用法以及效率

QString类 QString是Qt框架中提供的字符串类&#xff0c;用于处理Unicode字符串。它提供了许多方便的方法和功能&#xff0c;可以进行字符串的连接、查找、替换、截取等操作。QString类的对象是可变的&#xff0c;可以在运行时修改字符串内容。 . 由以上引出一个知识点&#xf…

LabVIEW(一)简介

LabVIEW&#xff08;Laboratory Virtual Instrument Engineering Workbench&#xff09;是一种程序开发环境&#xff0c;是由美国国家仪器&#xff08;NI&#xff09;公司研制开发的。LabVIEW与其他计算机语言的显著区别是&#xff1a;其他计算机语言都是采用基于文本的语言产生…

linux驱动开发找不到工作寻求前辈建议?

linux驱动开发找不到工作寻求前辈建议? 不要局限驱动&#xff0c;我毕业的时候不成熟的想法就是做驱动比做应用有技术含量&#xff0c;就努力往这方面做&#xff0c;我就从应用转到驱动最近很多小伙伴找我&#xff0c;说想要一些Linux内核学习资料&#xff0c;然后我根据自己从…

产品经理必备知识——API接口

前言 在古代&#xff0c;我们的传输信息的方式有很多&#xff0c;比如写信、飞鸽传书&#xff0c;以及在战争中使用的烽烟&#xff0c;才有了著名的烽火戏诸侯&#xff0c;但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如今万物互联的时代&#xff0c;我通过…

嵌入式养成计划-36----C++引用--const--函数重载--结构体--类

八十、 引用 80.1 概念 引用是给目标取了个别名。引用与目标&#xff0c;它俩的地址一样 80.2 格式 数据类型 &引用名 同类型的变量名&#xff1b;数据类型 &引用名 同类型的变量名&#xff1b; eg&#xff1a;int a;int &b a; //b引用a,给a取个别名叫b80.3…