首页 > 代码库 > 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 重载[](下标运算符)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。