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

C++ 下標運算子 過載

我們常用下標運算子operator[]來訪問陣列中的某個元素.它是一個雙目運算子,第一個運算子是陣列名,第二個運算子是陣列下標.在類物件中,我們可以過載下標運算子,用它來定義相應物件的下標運算.

注意,C++不允許把下標運算子函式作為外部函式來定義,它只能是非靜態的成員函式.下標運算子定義的一般形式:
 
 T1T::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;

intsz;

};

int& aInteger::operator [](inti)

{

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;

}

intn = 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];

}

intgetLength()

{

return length;

}

char& operator[](int i);

~charArray()

{

delete[]buffer;

}

private:

intlength;

char* buffer;

};

char& charArray::operator[] (inti)

{

static char ch = 0;

if(i >= 0 && i< length)

return buffer[i];

else

{

cout << "out of range!"<< endl;

return ch;

}

}

int main()

{

inti;

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;

}