下标运算符重载
我们经常使用“[]”来访问数组中的元素,为了在类中也方便使用“[]”运算符,可以在类中重载这个运算符。重载“[]”运算符可以实现两个目的:
(1)“对象[下标]”的形式类似于“数组[下标]”,更加符合习惯。
(2)可以对下标进行越界检查。
重载下标运算符的一般格式如下所示:
返回类型 operator[] (参数列表);
上述格式中,“[]”运算符重载函数有且只有一个参数,表示下标值,通常为整型。重载下标运算符时一般把返回值指定为一个引用。
为了让读者加深理解,接下来通过一个案例来实现下标运算符的重载,具体代码如例1所示。
例1
1 #define _CRT_SECURE_NO_WARNINGS
2 #include <iostream>
3 using namespace std;
4 class Array
5 {
6 private:
7 int size;
8 char* buf;
9 public:
10 Array(int n);
11 Array(char* src);
12 ~Array()
13 {
14 delete[]buf;
15 }
16 char& operator[](int n);
17 void show()
18 {
19 for (int i = 0; i < size; i++)
20 {
21 cout << buf[i];
22 }
23 cout << endl;
24 }
25 };
26 //类成员函数的实现
27 Array::Array(int n)
28 {
29 size = n;
30 buf = new char[size + 1];
31 *(buf + size) = '\0';
32 }
33
34 Array::Array(char* src)
35 {
36 buf = new char[strlen(src) + 1];
37 strcpy(buf, src);
38 size = strlen(buf);
39 }
40
41 char& Array::operator[](int n)
42 {
43 static char ch = 0;
44 if (n > size || n < 0) //检查数组是否越界
45 {
46 cout << "out of the bound" << endl;
47 return ch;
48 }
49 else
50 return *(buf + n);
51 }
52 int main()
53 {
54 Array arr1(20);
55 for (int i = 0; i < 20; i++)
56 {
57 arr1[i] = 65 + i; //调用[]运算符重载函数赋值
58 }
59 arr1.show();
60
61 Array arr2("chuan zhi bo ke!");
62 cout << arr2[6] << endl;
63 arr2[6] = 'A';
64 arr2.show();
65 system("pause");
66 return 0;
67 }
运行结果如图1所示。
图1 例1运行结果
例1定义一个字符数组类,并重载了[]运算符,在构造arr1对象时,指定了数组大小,然后通过“[]”运算符来给数组赋值,由图1所知,赋值成功。而在构造arr2对象时,由一个字符串直接创建一个数组,然后调用“[]”运算符重载函数读取某一个字符元素,并且可以对字符元素进行修改。
注意:“[]”运算符也只能重载为类的成员函数。