C++自定义数组类以及操作符重载的实现

头文件部分

#pragma once
#include<iostream>
using namespace std;

class Array
{


public:
	Array();
	Array(int len);
	~Array();
	int& operator[](int i);
	void operator=(Array& array);
	friend ostream& operator<<(ostream& os, Array& array);
	friend void operator>>(istream& is, Array& array);
	friend bool operator==(Array& array1, Array& array2);
	friend bool operator!=(Array& array1, Array& array2);
	//声明加法运算符用于把两个 Array 对象相加,返回最终的 Array 对象。
	friend Array& operator+(Array& array1, Array& array2);
private:
	int len;
	int* space;
};

函数实现

#include "array.h"

Array::Array()
{
	this->len=0;
	this->space = NULL;
}

Array::Array(int len)
{
	if(len<=0)
	{
		Array();
	}
	else
	{
		this->len = len;
		this->space = new int[this->len];
		cout << "数组创建完成" << endl;
	}
}

Array::~Array()
{
	if (this->space != NULL)
	{
		delete this->space;
		this->space = NULL;
		this->len = 0;
		cout << "数组删除成功" << endl;
	}
}

ostream& operator<<(ostream& os, Array& array)
{
	for (int i = 0;i < array.len;i++)
	{
		os << array.space[i] << " ";

	}
	os << endl;
	return os;
}


void operator>>(istream& is, Array& array)
{
	for (int i = 0;i < array.len;i++)
	{
		int data;
		cout << "输入第" << i + 1 << "个数: ";
		cin >> data;
		array[i] = data;
	}
}


bool operator==(Array& array1, Array& array2)
{
	if (array1.len != array2.len)
		return false;
	else
	{
		for (int i = 0;i < array1.len;i++)
		{
			if (array1.space[i] != array2.space[i])
			{
				return false;
			}
		}
	}
	return true;
}

bool operator!=(Array& array1, Array& array2)
{
	if (array1.len != array2.len)
		return true;
	else
	{
		for (int i = 0;i < array1.len;i++)
		{
			if (array1.space[i] != array2.space[i])
			{
				return true;
			}
		}
	}
	return false;
}

int& Array::operator[ ](int i)
{
	//如果超出范围,返回匿名对象,函数结束后自动释放
	if (i + 1 > this->len)
	{
		Array array(i+1);
		return array.space[i];
	}
	return this->space[i];
}


void Array::operator=(Array& array)
{
	int* p = this->space;
	this->space = new int[array.len];
	this->len = array.len;
	for (int i = 0;i < array.len;i++)
	{
		(*this)[i] = array[i];
	}
	delete p;
}


Array& operator+(Array& array1, Array& array2)
{
	Array* p = new Array(array1.len + array2.len);

	for (int i = 0;i < array1.len;i++)
	{
		(*p)[i] = array1[i];
	}

	int j = 0;
	for (int i = array1.len;i < (*p).len;i++)
	{
		(*p)[i] = array2[j];
		j++;
	}
	return (*p);
}

补充

可重载运算符/不可重载运算符

下面是可重载的运算符列表:
双目算术运算符 + (加),-(减),(乘),/(除),% (取模)
关系运算符 ==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),>=(大于等于)
逻辑运算符 ||(逻辑或),&&(逻辑与),!(逻辑非)
单目运算符 + (正),-(负),
(指针),&(取地址)
自增自减运算符 ++(自增),–(自减)
位运算符 | (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移)
赋值运算符 =, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=
空间申请与释放 new, delete, new[ ] , delete[]
其他运算符 ()(函数调用),->(成员访问),,(逗号),[ ]下标

下面是不可重载的运算符列表:

.:成员访问运算符
.*, ->*:成员指针访问运算符
:::域运算符
sizeof:长度运算符
?::条件运算符
#: 预处理符号

有四个操作符不能是全局域中的重载,这四个操作符是:=, ->,[ ],()*
即不能重载为友员函数.

posted @ 2022-02-10 23:04  brbrbr  阅读(178)  评论(0)    收藏  举报