[]我们在使用数组的时候,int a[10]; 定义一个数组,我们访问数组中的数据的时候,可以根据数组的下标进行访问, a[1] 等来访问数组中存放的数据。
上面的情况是否可以使用到类对象中呢? -- 使用[]直接访问成员属性中存放的数据。使用下标运算符重载函数可以实现。(前面说了,下标运算符重载应该作为成员函数重载)
enum {AGE,SALARY};
#define NAME "name"
class Human {
public:
Human(int age, int salary, const char* name);
int operator[](int n); // 使用下标运算符返回整数
string operator[](const char* n); // 使用下标运算符返回字符串
private:
int age;
int salary;
string name;
};
int main(void) {
Human man1(18, 15000, "ABC");
// man1.operator[](AGE);
cout << man1[AGE] << endl; // 18
// man1.operator[](NAME); // ABC
cout << man1[NAME] << endl;
system("pause");
return 0;
}
Human::Human(int age, int salary, const char* name)
{
this->name = name;
this->salary = salary;
this->age = age;
}
int Human::operator[](int n)
{
int ret;
if (n == AGE) {
ret = age;
}
else if (n == SALARY) {
ret = salary;
}
return ret;
}
string Human::operator[](const char* n)
{
string ret;
if (!strcmp(n, NAME)) {
ret = name;
}
return ret;
}
代码分析:
1. 其实下标运算符也很好理解,我们使用,对象[参数]的时候,编译其会调用函数对象.operator[](参数),其实我们就是根据这个传入的参数的不同来返回相应成员属性的值。
2. 因为我们是根据传入的参数返回成员属性,但是成员属性有很多种类型,我们需要根据自己的实际需求来定义相应的下标运算符函数,比如上面我们定义了返回int和string两种类型的函数。
3. 代码中我们分别以整数和字符串为参数,其实以什么为参数是根据自己的规定来的,比如: 我们传入参数1: 返回age, 传入参数2: 返回salary。
代码思路:
1. 我们前面说到了,传入的参数是根据我们的规定来判断返回什么的,也就是说我们传入的数字具有了一定的特殊意义,这时候我们就可以将这些数字定义成枚举类型,这样可以提高代码的可读性和可维护性。
2. 比如,我们上面使用枚举定义了AGE和SALARY,当我们需要获取age的时候,就传入参数AGE -- man[AGE]。在下标运算符重载中,判断也是根据参数是否等于我们定义的枚举常量, n==AGE, 类推,这样写代码更加的可读。
3. 当然如果我们传入的参数是字符串类型,那可以使用宏来代替。
4. 其实传入的参数是字符串还是整数或者其他类型,都是根据自己的需求来指定的。其实传入字符串,就是以成员属性的名称作为参数。