1,本文讲述数组操作符重载,上篇博文的字符串类 string 确实强大,但 string 类 对象还具备 C 方式字符串的灵活性吗?还能直接访问单个字符吗?
1,C 方式字符串灵活性是指能够通过数组访问操作符方便的访问字符串中的单个字符;
2,字符串类的兼容性:
1,string 类最大限度的考虑了 C 字符串的兼容性;
2,可以按照使用 C 字符串的方式使用 string 对象;
3,代码示例:
1 string s = "a1b2c3d4e"; 2 int n = 0; 3 4 for(int i=0; i<s.length(); i++) 5 { 6 if( isdigit(s[i]) ) 7 { 8 n++; 9 } 10 }
3,用 C 方式使用 string 类编程实验:
1,main.cpp 文件:
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 int main() 7 { 8 string s = "a1b2c3d4e"; 9 int n = 0; 10 11 for(int i = 0; i<s.length(); i++) 12 { 13 if( isdigit(s[i]) ) 14 { 15 n++; 16 } 17 } 18 19 cout << n << endl; 20 21 return 0; 22 }
2,输出结果:
4
3,在任意的 C++ 编译器中都支持数组访问的方式来使用字符串对象;
4,问题:
1,类的对象怎么支持数组的下标访问?
1,C++ 编译器并不支持将数组访问操作符和任意的类对象一起使用;
5,重载数组访问操作符:
1,数组访问符是 C/C++ 中的内置操作符;
1,数组访问操作符地位和 “+”、“-”、“*”、“/”、“==”、“=” 等内置操作符地位一致;
2,是操作符、地位同上,意味着可以重载;
2,数组访问符的原生意义是数组访问和指针运算;
1,a[n] <==> *(a + n) <==> *(n + a) <==> n[a];
1,指针和最终偏移地址相加,然后取元素;
2,加法交换律;
2,访问数组中的元素深层次的意义就是指针运算,算偏移量;
6,指针与数组的复习实例分析:
1,main.cpp 文件:
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 int main() 7 { 8 int a[5] = {0}; 9 10 for(int i=0; i<5; i++) 11 { 12 a[i] = i; 13 } 14 15 for(int i=0; i<5; i++) 16 { 17 cout << *(a + i) << endl; // ==> cout << a[i] << endl; 18 } 19 20 cout << endl; 21 22 for(int i=0; i<5; i++) 23 { 24 i[a] = i + 10; // ==> a[i] = i + 10; 25 } 26 27 for(int i=0; i<5; i++) 28 { 29 cout << *(i + a) << endl; // cout << a[i] << endl; 30 } 31 32 return 0; 33 }
2,输出结果:
1 0 2 1 3 2 4 3 5 4 6 7 10 8 11 9 12 10 13 11 14
2,结论:
1,数组访问操作符原生语义是访问数组中的某个元素,深层次的意义是算地址的偏移量;
7,重载数组访问操作符:
1,数组访问操作符([]):
1,只能通过类的成员函数重载;
2,重载函数能且仅能使用一个参数;
1,参数可以是不同的类型;
3,可以定义不同参数的多个重载函数;
8,重载数组访问操作符编程实验:
1,main.cpp 文件:
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class Test 7 { 8 int a[5]; // 被模拟的数组; 9 public: 10 int& operator [] (int i) // 能且仅能重载一个参数;引用是为了可以当做左值,因为不引用则直接是函数调用的返回值,它是不能当做左值使用的; 11 { 12 return a[i]; // 这里返回的不是局部变量,所以可以返回引用,且引用能够返回位置; 13 } 14 15 /* 通过字符串来访问数组 */ 16 int& operator [] (const string& s) // 定义多个重载函数;引用是为了可以当做左值; 17 { 18 if( s == "1st" ) 19 { 20 re