前面已经提到,下标操作符[]
必须以类的成员函数的形式进行重载。在类中的声明格式如下:
返回值类型 & operator[] (参数)
或
const 返回值类型 & operator[] (参数)
使用第一种声明方式,操作符重载函数不仅可以访问对象,同时还可以修改对象。使用第二种声明方式,操作符重载函数只能访问而不能修改对象。
默认情况下,通过下标访问数组中的元素并不具有检查边界溢出功能,我们可以通过重载实现该功能。
请看下面的代码:
#include<iostream>
#include<string>
using namespace std;
class Array{
private:
int length;
int * num;
public:
Array(): length(), num(NULL){ }
Array(int n);
int & operator[](int);
const int & operator[]( int )const;
int getlength() const{ return length; }
};
Array::Array(int n){
num = new int[n];
length = n;
}
int& Array::operator[](int i){
if(i < || i >= length)
throw string("out of bounds");
return num[i];
}
const int & Array::operator[](int i) const{
if(i < || i >= length)
throw string("out of bounds");
return num[i];
}
int main(){
Array A();
int i;
try{
for(i = ; i < A.getlength(); i++)
A[i] = i;
for(i = ;i < ; i++ )
cout<< A[i] <<endl;
}catch(string s){
cerr<< s <<", i = "<< i <<endl;
} return ;
}
本例提供了两个版本的下标运算符重载函数:
int & operator[]( int );
const int & operator[]( int )const;
第一个函数最后不带 const,加上 const 意味着该成员函数是常成员函数,如果第一个函数后面也加上了const,则两个函数仅有返回值不同,编译器不能够区分这是函数重载,会报错。这两个版本的重载函数其实很好理解,第一个能够修改对象,第二个只能访问对象而不能修改对象。
重载下标运算符[]后,“arr[5]”会被转换为:
arr.operator[]( 5 ); 最后需要说明的是:即使没有定义 const 版本的重载函数,这段代码也是可以正确运行的,但是非 const 成员函数不能处理 const 对象,所以在编程时通常会提供两个版本的运算符重载函数。