過載陣列下標操作符,使用operator
陣列在類的定義中確定好了長度之後,就會限制所要儲存的元素的個數,假如我們要儲存的元素的個數超過了已確定的陣列的長度,那麼就會導致陣列越界。故最好的辦法就是在建立物件的時候才確定要儲存元素的個數,即陣列的長度,而不是在陣列定義的時候。
此時,可採用過載陣列下標操作符[]函式來解決,即建立一個char& A::operator[](int i);函式,i為建立物件陣列傳過來的下標值。具體例子如下:
#include <iostream>
using namespace std;
class A
{
private:
int length;
char* Size; //定義指向char型別陣列的的空間的指標
public:
A(int l)
{
length=l;
Size=new char[length];//在堆中開闢新空間,儲存char型別陣列,長度為length(此長度在建立物件時確定),
//該空間的地址賦給成員指標變數Size
}
~A(){delete [] Size;}
int GetLength(){return length;}
char& operator[](int i);//宣告下標操作函式operator[],i為物件陣列傳過來的下標值
//用 [] 取值,並通過 [] 修改原來的元素,所以要通過引用返回的就是 size[] 本身的一個元素。
};
char& A::operator [](int i)
{
if(i>=0&&i<=length)
return Size[i];
else
{
cout<<"\n超出範圍!\n";
return Size[length-1];
}
}
#include "demoClass_1.h"
using namespace std;
//使用operator[]下標函式的優點:(1)不用將陣列的長度定義為一個常量;(2)可避免陣列越界。
//注意點:(1)由於下標運算子函式的引數是陣列的下標,因此該函式只能帶一個引數,不可帶多個引數;
//(2)由於下標運算子函式只限於本類的物件使用,因此不得將下標運算子函式過載為友元函式,且必須是非static成員函式。
int main()
{
A a(6);
char* ch="helloEV";
for(int i=0;i<8;i++)
{
a[i]=ch[i];//每迴圈一次,將ch中的一個字元賦給物件a的char型陣列,
//賦值符左邊的a[i]==a.operator[](i),即呼叫過載建構函式,i是下標值。
//如果i不超過堆中建立的char型陣列長度,
//那麼返回char型陣列的第i個元素;如果超過,則返回該陣列的最後一個元素。
cout<<"第"<<i+1<<"次迴圈:"<<a[i]<<endl;
}
cout<<"\n";
for(int j=0;j<8;j++)
cout<<a[j]<<endl;
cout<<"\n";
cout<<a.GetLength()<<endl;
}