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