前面已经提到,下标操作符[]
必须以类的成员函数的形式进行重载。在类中的声明格式如下:
返回值类型 & 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 对象,所以在编程时通常会提供两个版本的运算符重载函数。
时间: 2024-10-04 11:35:19