c++运算符重载(5)-- 下标运算符([ ])

[]我们在使用数组的时候,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.   其实传入的参数是字符串还是整数或者其他类型,都是根据自己的需求来指定的。其实传入字符串,就是以成员属性的名称作为参数。

 

你可能感兴趣的:(c++)