C++カスタム配列クラスおよびオペレータリロードの実装

24208 ワード

ヘッダファイルセクション
#pragma once
#include
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:     
?::     
#:      

4つのオペレータは、=,->,[],(*)すなわち、友員関数として再ロードできない全ローカル領域でのリロードではありません.