数组访问的一些思考
string类最大限度地考虑了C字符串的兼容性。
可以按照使用C字符串的方式适应string对象。
#include <iostream>
#include "add.h"
using namespace std;
int main(void)
{
string s = "safbd1334";
int n = 0;
for (int i = 0; i < s.length(); i++)
{
if (isdigit(s[i]))
{
n++;
}
}
cout << "n = " << n << endl;
return 0;
}
编译通过,编译结果:n = 4
提问:类的对象怎么支持数组的下标访问?
错误例子:
#include <iostream>
#include "add.h"
using namespace std;
class Test
{
private:
public:
};
int main(void)
{
Test t;
cout << t[0] << endl;
return 0;
}
编译报错:error: no match for ‘operator[]’ (operand types are ‘Test’ and ‘int’)
,这说明数组下标访问不能对任意的类对象进行访问。
数组访问操作符配忽略的
数组访问操作符是C/C++中的内置操作符。
数组访问操作符的原生意义是数组访问和指针运算。
a[0] <--> *(a + n) <--> *(n + a) <--> n[a]。
#include <iostream>
#include "add.h"
using namespace std;
int main(void)
{
int a[5] = {0};
for (int i = 0; i < 5; i++)
{
a[i] = i;
}
for (int i = 0; i < 5; i++)
{
cout << *(a + i) << endl;
}
cout << endl;
for (int i = 0; i < 5; i++)
{
i[a] = i + 10;
}
for (int i = 0; i < 5; i++)
{
cout << *(i + a) << endl;
}
cout << endl;
return 0;
}
输出结果:
0
1
2
3
4
10
11
12
13
14
数组访问操作符“[]”的注意事项
只能通过类的成员函数重载。
重载函数能且仅能使用一个参数。
可以定义不同参数的多个重载函数。
例子1:
#include <iostream>
#include "add.h"
using namespace std;
class Test
{
public:
int operator [] (int i)
{
return 0;
}
int operator [] (const char *s)
{
return 0;
}
};
int main(void)
{
Test t;
cout << t[1] << endl;
return 0;
}
编译没有报错。
例子2
#include <iostream>
#include "add.h"
using namespace std;
class Test
{
int a[5];
public:
int &operator [] (int i)
{
return a[i];
}
int &operator [] (const string &s)
{
if (s == "lst")
{
return a[0];
}
else if (s == "2nd")
{
return a[1];
}
else if (s == "3th")
{
return a[2];
}
else if (s == "4th")
{
return a[3];
}
else if (s == "5th")
{
return a[4];
}
else
{
return a[4];
}
}
int length()
{
return 5;
}
};
int main(void)
{
Test t;
for (int i = 0; i < t.length(); i++)
{
t.operator[](i) = i;
}
for (int i = 0; i < t.length(); i++)
{
cout << t[i] << endl;
}
cout << "test class arrr" << endl;
cout << t["lst"] << endl;
cout << t["2nd"] << endl;
cout << t["3th"] << endl;
cout << t["4th"] << endl;
cout << t["5th"] << endl;
return 0;
}
标签:return,int,++,34,Test,操作符,数组,重载,include From: https://www.cnblogs.com/laoyou12138/p/18007379