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 对象,所以在编程时通常会提供两个版本的运算符重载函数。
原文地址:https://www.cnblogs.com/Caden-liu8888/p/5827667.html