c++支持重载[]符,这样就可以像操作普通数组一样操作对象数组。
下面创建一个intarray数组类,实现对数据下标的越界检查。
class IntArray
{
private:
int *aptr;
int arraySize;
void memError(); //处理内存分配错误
void subError(); //处理下标越界
public:
IntArray(int);
IntArray(const IntArray &);
~IntArray();
//返回对象元素个数
int size(){return arraySize;}
//重载[]运算符
int &operator[](const int &);
};
主要关注其[]运算符的重载函数:
/*
** 重载[]运算符
** 参数:数组下标
** 返回值:数组元素的引用
*/
int &IntArray::operator[](const int &n)
{
//检查下标是否越界
if(n<0 || n>arraySize)
subError();
//返回string对象的数组元素
return aptr[n];
}
说明:
-
该函数的形参是一个int类型的常引用,表示数组的下标。如果table是一个intarray类的对象,那么table[12]就是将12传递给参数n。
-
该函数返回一个int类型的引用,是因为该函数有时会出现在等号的左边:table[12] = 50; 赋值运算符=的左边必须代表一个可修改的内存空间,比如变量,但是不能是一个常量。上式其实就相当于:*(aptr + 12) = 50;
-
由于该重载函数返回一个整型元素(实际上是它的一个引用),因此intarray类不需要重载关系运算符和算术运算符,即可直接使用。
主函数测试程序:
#include <iostream>
using namespace std;
#include "intArray.h"
int main()
{
cout << "string类对象的[]运算符重载函数测试" << endl;
IntArray table(10);
int x;
//每个元素赋值
for(x=0; x<table.size(); x++)
table[x] = x;
//输出各个元素
for(x=0; x<table.size(); x++)
cout<<table[x]<<" ";
cout<<endl;
//使用系统提供的++运算符操作数组元素
for(x=0; x<table.size(); x++)
table[x]++;
//输出各个元素
for(x=0; x<table.size(); x++)
cout<<table[x]<<" ";
cout<<endl;
//测试下标越界访问
table[11] = 0;
return 0;
}
运行结果: