String类最大限度的考虑了C字符串的兼容性,可以按照使用C字符串的方式使用string对象,也就是可以通过数组下标访问String对象的单个字符,例子
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
string s = "abcdefg123";
int n = 0;
for(int i=0;i<s.length();i++)
{
if(isalpha(s[i]))
{
n++;
}
}
cout<<n<<endl;
}
结果:
sice@sice:~$ ./a.out
7
那么类的对象是怎么支持数组的下标访问的呢?这是大家常常忽略的事实,数组访问符设是C/C++中的内置操作符,也就是可以算出偏移量,数组访问符的原生意义是数组访问和指针运算,这里我们就开始引入数组操作符的重载
数组访问操作符([])
只能通过类的成员函数重载
重载函数能且仅能使用一个参数
可以定义不同参数的多个重载函数
例子:
#include <iostream>
#include <string>
using namespace std;
class Test
{
int a[5];
public:
int& operator [] (int i)
{
return a[i];
}
int& operator [] (const string& s)
{
if( s == "1st" )
{
return a[0];
}
else if( s == "2nd" )
{
return a[1];
}
else if( s == "3rd" )
{
return a[2];
}
else if( s == "4th" )
{
return a[3];
}
else if( s == "5th" )
{
return a[4];
}
return a[0];
}
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;
}
cout << t["5th"] << endl;
cout << t["4th"] << endl;
cout << t["3rd"] << endl;
cout << t["2nd"] << endl;
cout << t["1st"] << endl;
return 0;
}
结果:
sice@sice:~$ ./a.out
0
1
2
3
4
4
3
2
1
0
可以看出数组操作符重载了,到这里大家就不会觉得通过数组下标访问字符串觉得奇怪了