下付き演算子の再ロード

2291 ワード

下付き演算子の再ロード
配列内の要素にアクセスするには、下付き演算子operator[]を使用します.これは両目演算子で、最初の演算子は配列名で、2番目の演算子は配列の下付きです.クラスオブジェクトでは、対応するオブジェクトの下付き演算子を定義するために、下付き演算子を再ロードすることができます.
なお、C++は、下付き演算子関数を外部関数として定義ことは許されず、非静的なメンバー関数のみである.下付き演算子定義の一般的な形式:
T1 T::operator[](T2);
ここで、Tは、定数である必要のない下付き演算子を定義クラスである.T 2は、整形、文字型、クラスなどの任意のタイプの下付き文字を表す.T 1は配列演算の結果である.任意のタイプであってもよいが、配列に値を割り当てるために参照形式として宣言するのが一般的である.上記の定義がある場合は、次の2つの形式のいずれかを使用して呼び出すことができます.
x[y]またはx.operator[](y)
xのタイプはT、yのタイプはT 2である.
簡単な例を見てみましょう.
#include 

class aInteger
{
public:
aInteger(int size)
{
sz = size;
a = new int[size];
}

int& operator [] (int i);

~aInteger()
{
delete []a;
}
private:
int* a;
int sz;
};

int& aInteger::operator [](int i)
{
if (i < 0 || i > sz)
{
cout << "error, leap the pale" << endl;
}

return a[i];
}

int main()
{
aInteger arr(10);
for (int i = 0; i < 10; i++)
{
arr[i] = i+1;
cout << arr[i] << endl;
}

int n = arr.operator [] (2);
cout << "n = " << n << endl;

return 0;
}

整形配列aintegerには、境界を越えたエラーをチェックできる下付き演算子が定義されています.次に使用します.
ainteger ai(10);
ai[2]=3;
int i=ai[2];
ai[2]=3の場合、彼はaiを呼び出す.operator(2)は、ai::a[2]への参照を返し、次にデフォルトの付与演算子を呼び出し、3の値をこの参照に付与するので、ai::a[2]の値は3である.なお、戻り値が参照形式を採用する場合、ai.Operator(2)の戻り値は一時変数であり,左値にはできないため,上記の付与値でエラーが発生する.初期化i=ai[2]については、まずaiを呼び出す.operator(2)ai::a[2]の値を取り出します.次に、デフォルトのレプリケーション構造関数を再利用してiを初期化する.
例:
//**********************************
//***         ***
//**********************************

#include 

class charArray
{
public:
charArray(int len)
{
length = len;
buffer = new char[length];
}

int getLength()
{
return length;
}

char& operator[](int i);

~charArray()
{
delete[]buffer;
}
private:
int length;
char* buffer;
};

char& charArray::operator[] (int i)
{
static char ch = 0;
if (i >= 0 && i < length)
return buffer[i];
else
{
cout << "out of range!" << endl;
return ch;
}
}

int main()
{
int i;
charArray str1(7);
char* str2 = "string";
for (i = 0; i < 7; i++)
{
str1[i] = str2[i];
}

for (i = 0; i < 7; i++)
{
cout << str1[i];
}
cout << str1.getLength() << endl;

return 0;
}