1. 程式人生 > >下標運算子的過載

下標運算子的過載

下標運算子過載
我們常用下標運算子operator[]來訪問陣列中的某個元素.它是一個雙目運算子,第一個運算子是陣列名,第二個運算子是陣列下標.在類物件中,我們可以過載下標運算子,用它來定義相應物件的下標運算.
注意,C++不允許把下標運算子函式作為外部函式來定義,它只能是非靜態的成員函式.下標運算子定義的一般形式:
T1 T::operator[](T2);
其中,T是定義下標運算子的類,它不必是常量.T2表示下標,它可以是任意型別,如整形,字元型或某個類. T1是陣列運算的結果.它也可以是任意型別,但為了能對陣列賦值,一般將其宣告為引用形式.在有了上面的定義之後,可以採用下面兩種形式之任一來呼叫它:
x[y] 或 x.operator[](y)
x的型別為T,y的型別為T2.
下面來看一個簡單的例子:
#include <iostream.h>

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 <iostream.h>

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;
}