C++重载下标操作符
前面已经提到,下标操作符
在我们访问数组时,通过下标去访问数组中的元素并不具有检查边界溢出功能,我们可以重载下标操作符使之具有相应的功能。
【例 1】
这两种版本的下标操作符重载函数其实很好理解,一个是可以修改类对象,下面一个则只可以访问对象而不能修改对象。对于上面一种下标操作符重载函数的声明,以下两个语句都是有效的:
我们再来看下标操作符重载函数的定义,在函数体内部,先进行下标越界检测,如果出现越界则抛出异常,否则就返回下标 i 所对应的数据。这两种版本的下标操作符重载函数的函数定义都是如此。
我们来看一下程序输出结果:
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
[ ]
必须要以类的成员函数的形式进行重载。其在类中的声明格式如下:
返回类型 & operator[] (参数)
或
const 返回类型 & operator[] (参数)
在我们访问数组时,通过下标去访问数组中的元素并不具有检查边界溢出功能,我们可以重载下标操作符使之具有相应的功能。
【例 1】
#include<iostream> #include<string> using namespace std; class Array { public: Array(){length = 0; num = NULL;}; Array(int n); int & operator[]( int ); const int & operator[]( int )const; int getlength() const {return length;} private: int length; int * num; }; Array::Array(int n) { try { num = new int[n]; } catch(bad_alloc) { cerr<<"allocate storage failure!"<<endl; throw; } 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; }本例中定义了一个 Array 类,表示的是一个整形数组,类中重载了下标操作符,使之具备检测下标溢出的功能。在本例中重载下标操作符,我们提供了两个版本的重载下标操作符函数:
int & operator[]( int ); const int & operator[]( int )const;需要注意的是,第一个下标操作符重载函数最后面不带 const,加上 const 意味着该成员函数是常成员函数,如果第一个函数后面也加上了 const,则两个函数仅有返回值不相同,这个不足以用于区分函数,编译器会提示语法错误。
这两种版本的下标操作符重载函数其实很好理解,一个是可以修改类对象,下面一个则只可以访问对象而不能修改对象。对于上面一种下标操作符重载函数的声明,以下两个语句都是有效的:
arr[5] = 7; int var = arr[3];换言之,我们既可以访问类对象,同时又能修改类对象。“arr[5]”其实可以理解为:
arr.operator[](5);而对于下面一种下标操作符重载函数,我们不能修改对象,也就是说语句
arr[5]=7;
语句是无效的,但是它依然可以用于访问对象,因此int var=arr[3];
语句仍然有效。我们再来看下标操作符重载函数的定义,在函数体内部,先进行下标越界检测,如果出现越界则抛出异常,否则就返回下标 i 所对应的数据。这两种版本的下标操作符重载函数的函数定义都是如此。
我们来看一下程序输出结果:
0
1
2
3
4
out of bounds, i = 5
void display(const Array & A) { for(int i=0; i < A.getlength(); i++) cout<< A[i] <<endl; }此时如果我们在例 1 中没有定义 const 版本的下标操作符重载函数,则例 1 将会出现语法错误,无法通过编译。
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。