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

文章目录

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

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


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

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

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

cpp 复制代码
#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 数组实现类

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 测试类

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、执行结果

执行结果 :

cpp 复制代码
 调用有参构造函数
5
6
7
 调用有参构造函数
 调用有参构造函数
 调用 等号 = 操作符重载 函数
 调用 等号 = 操作符重载 函数
5
6
7
array == array3 : 1
array != array3 : 0
Press any key to continue . . .
相关推荐
yuyanjingtao36 分钟前
CCF-GESP 等级考试 2023年9月认证C++四级真题解析
c++·青少年编程·gesp·csp-j/s·编程等级考试
闻缺陷则喜何志丹1 小时前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
charlie1145141911 小时前
C++ STL CookBook
开发语言·c++·stl·c++20
小林熬夜学编程1 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
倔强的石头1061 小时前
【C++指南】类和对象(九):内部类
开发语言·c++
A懿轩A3 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
机器视觉知识推荐、就业指导3 小时前
C++设计模式:享元模式 (附文字处理系统中的字符对象案例)
c++
半盏茶香3 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
Ronin3054 小时前
11.vector的介绍及模拟实现
开发语言·c++
✿ ༺ ོIT技术༻4 小时前
C++11:新特性&右值引用&移动语义
linux·数据结构·c++