C++カスタム配列クラスおよびオペレータリロードの実装
24208 ワード
ヘッダファイルセクション
関数の実装
補足
リロード可能演算子/リロード不可演算子
次に、リロード可能な演算子のリストを示します:両目演算子+(プラス)、-(マイナス)、(乗算)、/(除算)、%(型取り)関係演算子==(等しい)!=(等しくない),<(より小さい),>(より大きい),<=(より小さい),>=(より大きい)論理演算子|(論理または),&(論理と),!(論理非)単眼演算子+(正),-(負),(ポインタ),&(アドレス取り)自増自減演算子++(自増),-(自減)ビット演算子|(ビットまたは),&(ビットと),~(ビットで逆),^(ビット別)、<(左シフト)>(右シフト)賦値演算子=,+=,-=,*=,/,%=,&=,|=,^=,<=,>>>=空間出願とリリースnew,delete,new[],delete[]その他の演算子()(関数呼び出し)->(メンバーアクセス),,(カンマ),[]下付き
次に、再ロードできない演算子のリストを示します.
4つのオペレータは、=,->,[],(*)すなわち、友員関数として再ロードできない全ローカル領域でのリロードではありません.
#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つのオペレータは、=,->,[],(*)すなわち、友員関数として再ロードできない全ローカル領域でのリロードではありません.