首页 > 代码库 > C++学习29 重载[](下标运算符)

C++学习29 重载[](下标运算符)

前面已经提到,下标操作符[]必须以类的成员函数的形式进行重载。在类中的声明格式如下:

返回值类型 & operator[] (参数)

const 返回值类型 & operator[] (参数)

使用第一种声明方式,操作符重载函数不仅可以访问对象,同时还可以修改对象。使用第二种声明方式,操作符重载函数只能访问而不能修改对象。

默认情况下,通过下标访问数组中的元素并不具有检查边界溢出功能,我们可以通过重载实现该功能。

请看下面的代码:

#include<iostream>#include<string>using namespace std;class Array{private:    int length;    int * num;public:    Array(): length(0), 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 < 0 || i >= length)        throw string("out of bounds");    return num[i];}const int & Array::operator[](int i) const{    if(i < 0 || i >= length)        throw string("out of bounds");    return num[i];}int main(){    Array A(5);    int i;    try{        for(i = 0; i < A.getlength(); i++)            A[i] = i;        for(i = 0 ;i < 6; i++ )            cout<< A[i] <<endl;    }catch(string s){        cerr<< s <<", i = "<< i <<endl;    }      return 0;}

 本例提供了两个版本的下标运算符重载函数:

int & operator[]( int );const int & operator[]( int )const;

第一个函数最后不带 const,加上 const 意味着该成员函数是常成员函数,如果第一个函数后面也加上了const,则两个函数仅有返回值不同,编译器不能够区分这是函数重载,会报错。这两个版本的重载函数其实很好理解,第一个能够修改对象,第二个只能访问对象而不能修改对象。

重载下标运算符[]后,“arr[5]”会被转换为:

arr.operator[]( 5 );

最后需要说明的是:即使没有定义 const 版本的重载函数,这段代码也是可以正确运行的,但是非 const 成员函数不能处理 const 对象,所以在编程时通常会提供两个版本的运算符重载函数。

C++学习29 重载[](下标运算符)