首先问一下,在使用了string类后我们还能像在C中使用下标来操作数组的元素吗?当然可以啦,因为C++会最大限度的兼容C的用法,依然能够用下标操作单个字符。
看下面一个逆序字符串例子:
void reverseString(string &str)
{
int begin = 0;
int end = str.length()-1;
while(begin < end)
{
swap(str[begin++], str[end--]);
}
}
函数在循环中不断的使用C++提供的交换函数实现串中首尾两个元素交换,还记得使用引用交换元素和使用指针交换的差异吗?前面可是讲解过的。这个例子说明了我们仍然可以引用下标来操作string对象的单个字符。
实现是实现了,但是想过为什么能够实现这种炫酷的操作,string定义的可是一个对象啊,答案肯定是有的,因为我们可以对数组访问操作符进行重载啊。
在进行重载之前需要知道一些准备知识,数组访问操作符是C/C++内置操作符,它的原生意义是数组访问和进行指针运算。
我们知道这样一个等价关系:
a[n] <--> *(a+n) <--> *(n+a) <--> n[a]
数组访问操作符只能通过成员函数进行重载,可以定义多个不同的重载函数但是成员函数只能使用一个参数。它重载后的意义就是能够使得对象能够模拟数组的行为。下面进行一个简单的重载:
class Test
{
int a[5];
public:
int& operator [] (int i)
{
return a[i];
}
int length()
{
return 5;
}
};
int main()
{
Test t;
for(int i=0; i<t.length(); i++)
t[i] = i;
for(int i=0; i<t.length(); i++)
cout << t[i] << endl;
return 0;
}
定义一个类,有一个私有数组,重载数组访问操作符,重载函数有一个int变量,函数返回数组第i个元素。为什么重载函数返回类型是一个引用变量呢?由于想要模拟数组的操作的话能够给数组元素赋值是必不可少的,普通的返回类型并不能作为左值使用,只有使用引用才能接受数据赋值,因为引用就是一个变量的别名,指代了一片可以修改其内容的存储空间。
我们在学习C的时候能通过字符串作为索引获取数组元素吗?显然是不可能的,前面实现了对数组访问操作符的重载函数,使用了一个int型变量作为索引值使用,那么我们是不是可以将重载函数参数变成string类型呢?
int& operator [] (const string& s)
{
if( s == "111" )
{
return a[0];
}
else if( s == "222" )
{
return a[1];
}
return a[0];
}
再次对数组访问操作符进行重载,通过字符串作为索引操作数组元素。
Test t1;
t1["111"] = 100;
cout << "t1[\"111\"] = " << t1["111"] << endl;
最后输出肯定是T1["111"] = 100了。这算不算是比较新鲜的东西了,在C语言中绝无仅有,并且不可能实现。