1.首先說說為什么要重載操作符[ ]
主要是因為系統只給了整數類型(int)的重載函數,即只能在方括號中輸入整數進行查找,但有時候我們可能存放數據時,下標的類型是自定義的,希望也能像數組直接通過下標訪問元素的形式(形如A[i]) ,這時候就需要對下標操作符[]進行重載,使得操作得以進行
2.重載操作符[]的作用
一般作用是取值,引用返回值是這個值得別名,引用返回是返回原來的東西,在內存上是相同的,直接返回會創建一模一樣的臨時變量返回,類較大時,增加內存消耗
3.通過operator關鍵字進行重載
對操作符進行重載,需要使用operator關鍵字,形如: T1 T::operator[ ] (T2) 其中,T1是返回值類型,為了能對數組賦值,一般將其聲明為引用形式,T是定義下標運算符的類,T2是下標類型
4.重載操作符的原則
不能改變操作符的原有語義和操作符個數,[]用於取元素的值,且只有一個操作數,括號內的值是針對該數組操作的,所以肯定有一個數組對象,所以也就決定了重載實現的只能是類的成員函數,因為類的成員函數具有this指針,可以指向對象本身。對象[] :對象調用[],隱含地把this指針也傳進去了,查找自身數組中存放的東西
p[i]: 其中p是一個指針,內含某個地址,取值的時候,p中的地址加上變量i的地址偏移量,返回相加后地址中所存放的值
同理,對象[]也是如此,在對象的類中設定一個指針,假設從該指針開始的內存區域存放的是數據,在重載[]操作符中,返回值為該指針[],即對應內存,對象[]是指明使用哪個對象
#include "stdafx.h"
#include<iostream>
using namespace std;
typedef int Rank;
template<typename T>
class Vector
{
public:
Rank _size;
int _capacity;
T* _elem;
T& operator[] (Rank r)const;
void copyFrom(T const*A, Rank lo, Rank hi);
};
template<typename T>
T & Vector<T>::operator[] (Rank r)const
{
return _elem[r];
}
template<typename T>
void Vector<T>::copyFrom(T const* A, Rank lo, Rank hi)
{
_elem = new T[_capacity = 2 * (hi - lo)];
_size = 0;
while (lo < hi)
{
_elem[_size++] = A[lo++];
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//int B[5] = { 1, 2, 3, 4, 5 };
char B[5] = { 'a', 'b', 'c', 'd','e' };
//Vector<int> c;
Vector<char>c;
c.copyFrom(B, 0, 5);
for (int i = 0; i < 5;i++)
{
cout << B[i];
cout << c[i] << endl;
}
return 0;
}