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:长度运算符
?::条件运算符
#: 预处理符号
有四个操作符不能是全局域中的重载,这四个操作符是:=, ->,[ ],()*
即不能重载为友员函数.
本文来自博客园,作者:brbrbr,转载请注明原文链接:https://www.cnblogs.com/brbrbr/p/15881486.html

浙公网安备 33010602011771号