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