C++深度解析(24)—数组操作符的重载、数组类的改进

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_22847457/article/details/96592412

1.字符串类的兼容性

  • string类最大限度地考虑了C字符串的兼容性,可以按照使用C字符串的方式使用string对象。

 
 
  1. string s = "a1b2c3d4e";
  2. int n = 0;
  3. for( int i = 0;i < s.length();i++)
  4. {
  5. if( isdigit(s[i])){
  6. n++;
  7. }
  8. }
  • 编程实验:用C方式使用string类

 
 
  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. int main()
  5. {
  6. string s = "a1b2c3d4e";
  7. int n = 0;
  8. for ( int i = 0; i < s.length(); i++)
  9. {
  10. if ( isdigit(s[i])) // 用于检查十进制数字字符
  11. {
  12. n++;
  13. }
  14. }
  15. cout << n << endl;
  16. system( "pause");
  17. return 0;
  18. }
  • 打印结果为4

2.问题

  •  类的对象怎么支持数组的下标访问?

3.重载数组访问操作符

  • 被忽略的事实
    • 数组访问符是C/C++中的内置操作符 
    • 数组访问符的原生意义是数组访问和指针运算 

  • 指针与数组的复习

 
 
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main()
  5. {
  6. int a[ 5] = { 0 };
  7. for ( int i = 0; i < 5; i++)
  8. {
  9. a[i] = i;
  10. }
  11. for ( int i = 0; i < 5; i++)
  12. {
  13. cout << *(a + i) << endl; // cout<<a[i]<<endl;
  14. }
  15. cout << endl;
  16. for ( int i = 0; i < 5; i++)
  17. {
  18. i[a] = i + 10; // a[i]=i+10;
  19. }
  20. for ( int i = 0; i < 5; i++)
  21. {
  22. cout << *(i + a) << endl; // cout<<a[i]<<endl;
  23. }
  24. system( "pause");
  25. return 0;
  26. }
  • 运行结果

  • 数组访问操作符( [ ] ) 
    <ul><li><span style="color:#f33b45;"><strong>只能通过类的成员函数重载&nbsp;</strong></span></li>
    	<li><strong><span style="color:#f33b45;">重载函数能且仅能使用—个参数&nbsp;</span></strong></li>
    	<li>可以定义不同参数的多个重载函数&nbsp;</li>
    </ul></li>
    <li>编程实验——重载数组访问操作符</li>
    

 
 
  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. class Test
  5. {
  6. int a[ 5];
  7. public:
  8. int& operator[]( int i)
  9. { //注意重载函数的返回值,正常int时无法位于等式左边
  10. return a[i];
  11. }
  12. int& operator[]( const string &s)
  13. {
  14. if (s == "lst")
  15. {
  16. return a[ 0];
  17. }
  18. else if (s == "2nd")
  19. {
  20. return a[ 1];
  21. }
  22. else if (s == "3rd")
  23. {
  24. return a[ 2];
  25. }
  26. else if (s == "4th")
  27. {
  28. return a[ 3];
  29. }
  30. else if (s == "5th")
  31. {
  32. return a[ 4];
  33. }
  34. return a[ 0];
  35. }
  36. int length()
  37. {
  38. return 5;
  39. }
  40. };
  41. int main()
  42. {
  43. Test t;
  44. for ( int i = 0; i < t.length(); i++)
  45. {
  46. t[i] = i;
  47. }
  48. for ( int i = 0; i < t.length(); i++)
  49. {
  50. cout << t[i] << endl;
  51. }
  52. cout << t[ "5th"] << endl;
  53. cout << t[ "4th"] << endl;
  54. cout << t[ "3rd"] << endl;
  55. cout << t[ "2nd"] << endl;
  56. cout << t[ "1st"] << endl;
  57. system( "pause");
  58. return 0;
  59. }
  • 运行结果

4.数组类改进

  • 重载赋值操作符
  • 重载数组操作符
  • 重载比较操作符
  • Array.h

 
 
  1. #ifndef _ARRAY_H_
  2. #define _ARRAY_H_
  3. class Array
  4. {
  5. private:
  6. int mLength;
  7. int *mSpace;
  8. public:
  9. Array( int length);
  10. int length();
  11. ~Array(); // 析构函数
  12. int & operator[]( int i); // 数组下标运算符重载
  13. Array & operator=( const Array &obj); // 赋值运算符重载
  14. bool operator==( const Array &obj);
  15. bool operator!=( const Array &obj);
  16. };
  17. #endif
  • Array.cpp

 
 
  1. #include <stdio.h>
  2. #include "Array.h"
  3. Array::Array( int length)
  4. {
  5. if (length < 0)
  6. {
  7. length = 0;
  8. }
  9. mLength = length;
  10. mSpace = new int[mLength];
  11. }
  12. int Array::length()
  13. {
  14. return mLength;
  15. }
  16. Array::~Array()
  17. {
  18. mLength = -1;
  19. //printf("%08X\n",mSpace);
  20. delete[] mSpace;
  21. }
  22. int& Array:: operator[]( int i) // 返回必须是引用,否则不能作为左值使用
  23. {
  24. return mSpace[i];
  25. }
  26. Array& Array:: operator=( const Array &obj)
  27. {
  28. delete[] mSpace; // 释放自己原有的空间
  29. mLength = obj.mLength;
  30. mSpace = new int[mLength];
  31. for ( int i = 0; i < mLength; i++)
  32. {
  33. mSpace[i] = obj.mSpace[i];
  34. }
  35. return * this;
  36. }
  37. bool Array:: operator==( const Array &obj)
  38. {
  39. bool ret = true;
  40. if (mLength == obj.mLength)
  41. {
  42. for ( int i = 0; i < mLength; i++)
  43. {
  44. if (mSpace[i] != obj.mSpace[i])
  45. {
  46. ret = false;
  47. break;
  48. }
  49. }
  50. }
  51. else
  52. {
  53. ret = false;
  54. }
  55. return ret;
  56. }
  57. bool Array:: operator!=( const Array &obj)
  58. {
  59. return !(* this == obj);
  60. }
  • main.cpp

 
 
  1. #include <stdio.h>
  2. #include "Array.h"
  3. int main()
  4. {
  5. Array a1(10); // 自动调用构造函数
  6. Array a2(0);
  7. Array a3(0);
  8. if (a1 != a2)
  9. {
  10. printf( "a1 != a2\n");
  11. }
  12. for ( int i = 0; i < a1.length(); i++)
  13. {
  14. a1[i] = i + 1; // a1.operator[](i) = i + 1;
  15. }
  16. for( int i = 0; i < a1.length(); i++)
  17. {
  18. printf( "Element %d: %d\n", i, a1[i]);
  19. }
  20. printf( "\n");
  21. /*
  22. C++编译器会为每个类提供默认的赋值操作符
  23. 默认的赋值操作符只是做简单的值复制
  24. 类中存在指针成员变量时就需要重载赋值操作符
  25. */
  26. //a2 = a1; // 重载"="操作符 a2.operator=(a1);
  27. a3 = a2 = a1; // 等价于a3=a2.operator(a1); 返回值为Array的引用,连续赋值
  28. if (a1 == a2)
  29. {
  30. printf( "a1 = a2\n");
  31. }
  32. for( int i = 0; i < a2.length(); i++)
  33. {
  34. printf( "Element %d: %d\n", i, a2[i]);
  35. }
  36. printf( "Press any key to continue...");
  37. getchar();
  38. return 0;
  39. }
  • 运行结果

  • C++编译器会为每个类提供默认的赋值操作符
  • 默认的赋值操作符只是做简单的值复制
  • 类中存在指针成员变量时就需要重载赋值操作符
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值