9.6.3 下标运算符

    下标运算符是个二元运算符,C++编译器将表达式写成如下形式。


    sz[x];解释为如下所示。 sz.operator[](z);一般情况下,下标运算符的重载函数原型如下所示。 返回类型&operator[](参数类型);下标运算符的重载函数只能有一个参数,不过该参数并没有类型限制,使用何种类型都可以,如果类中未重载下标运算符,编译器将会给出下标运算符的默认定义,此时参数必须是int型,并且要声明数组名才能使用下标变量,如下所示。 computer com[3];

    则com[1]等价于com.operator[](1),如果[]中的参数类型非int型,或者非对象数组要使用下标运算符时,需要重载下标运算符[]。

    注意

    返回类型的引用很关键,这使得返回值可以作为左值。

    下标运算符的范例如代码9.11所示。

    代码9.11 下标运算符重载SubscriptOverload


    <————————————-文件名:example911.cpp——————————————-> 01 #include<iostream> 02 using namespace std; 03 class CharSZ//类CharSZ的定义 04 { 05 private://private成员列表 06 int Len; 07 char*pBuf; 08 public: 09 CharSZ(int l)//构造函数 10 { 11 Len=l; 12 pBuf=new char[Len];//开辟一块动态内存,字符数组 13 } 14 ~CharSZ()//析构函数 15 { 16 delete pBuf;//释放申请的动态内存 17 } 18 int GetLen()//读取private成员Len的值 19 { 20 return Len; 21 } 22 char&operator[](int i);//以成员函数形式重载下标运算符 23 }; 24 char&CharSZ:operator[](int i)//下标运算符重载的实现 25 { 26 static char def='\0';//局部静态变量,def,其值为空字符 27 if(i<Len&&i>=0)//如果参数i在有效范围内 28 return pBuf[i];//返回字符数组的第i+1个元素 29 else 30 { 31 cout<<"下标越界"<<endl;//参数i不合法 32 return def;//输出空字符 33 } 34 } 35 int main() 36 { 37 int cnt=0; 38 39 CharSZ de(7);//对象de中申请的动态内存大小为7,可存放6个有效字符(除开'\0') 40 char*sz="Helloo"; 41 for(;cnt<(strlen(sz)+1);cnt++)//从0~6,循环执行7次 42 de[cnt]=sz[cnt]; 43 for(cnt=0;cnt<de. GetLen();cnt++)//从0~6,循环执行7次 44 cout<<de[cnt]; 45 cout<<endl; 46 return 0; 47 }

    输出结果如下所示。


    Helloo

    【代码解析】代码9.11第24行对CharSZ类的下标运算符进行了重载,参数类型仍选为int,重载了[]后便可对普通CharSZ对象(而非CharSZ对象数组)使用[]运算符。