当前位置:   article > 正文

下标运算符的重载_怎么重载取下标运算符

怎么重载取下标运算符
下标运算符重载
我们常用下标运算符operator[]来访问数组中的某个元素.它是一个双目运算符,第一个运算符是数组名,第二个运算符是数组下标.在类对象中,我们可以重载下标运算符,用它来定义相应对象的下标运算.
注意,C++不允许把下标运算符函数作为外部函数来定义,它只能是非静态的成员函数.下标运算符定义的一般形式:
T1 T::operator[](T2);
其中,T是定义下标运算符的类,它不必是常量.T2表示下标,它可以是任意类型,如整形,字符型或某个类. T1是数组运算的结果.它也可以是任意类型,但为了能对数组赋值,一般将其声明为引用形式.在有了上面的定义之后,可以采用下面两种形式之任一来调用它:
x[y] 或 x.operator[](y)
x的类型为T,y的类型为T2.
下面来看一个简单的例子:
  1. #include <iostream.h>
  2. class aInteger
  3. {
  4. public:
  5. aInteger(int size)
  6. {
  7. sz = size;
  8. a = new int[size];
  9. }
  10. int& operator [] (int i);
  11. ~aInteger()
  12. {
  13. delete []a;
  14. }
  15. private:
  16. int* a;
  17. int sz;
  18. };
  19. int& aInteger::operator [](int i)
  20. {
  21. if (i < 0 || i > sz)
  22. {
  23. cout << "error, leap the pale" << endl;
  24. }
  25. return a[i];
  26. }
  27. int main()
  28. {
  29. aInteger arr(10);
  30. for (int i = 0; i < 10; i++)
  31. {
  32. arr[i] = i+1;
  33. cout << arr[i] << endl;
  34. }
  35. int n = arr.operator [] (2);
  36. cout << "n = " << n << endl;
  37. return 0;
  38. }



在整形数组ainteger中定义了下标运算符,这种下标运算符能检查越界的错误。现在使用它:
ainteger ai(10);
ai[2]=3;
int i=ai[2];
对于ai[2]=3,他调用ai.operator(2),返回对ai::a[2]的引用,接着再调用缺省的赋值运算符,把3的值赋给此引用,因而ai::a[2]的值为3。注意,假如返回值不采用引用形式,ai.operator(2)的返回值是一临时变量,不能作为左值,因而,上述赋值会出错。对于初始化i=ai[2],先调用ai.operator(2)取出ai::a[2]的值。然后再利用缺省的复制构造函数来初始化i.
实例:
  1. //**********************************
  2. //*** 下标重载运算符 ***
  3. //**********************************
  4. #include <iostream.h>
  5. class charArray
  6. {
  7. public:
  8. charArray(int len)
  9. {
  10. length = len;
  11. buffer = new char[length];
  12. }
  13. int getLength()
  14. {
  15. return length;
  16. }
  17. char& operator[](int i);
  18. ~charArray()
  19. {
  20. delete[]buffer;
  21. }
  22. private:
  23. int length;
  24. char* buffer;
  25. };
  26. char& charArray::operator[] (int i)
  27. {
  28. static char ch = 0;
  29. if (i >= 0 && i < length)
  30. return buffer[i];
  31. else
  32. {
  33. cout << "out of range!" << endl;
  34. return ch;
  35. }
  36. }
  37. int main()
  38. {
  39. int i;
  40. charArray str1(7);
  41. char* str2 = "string";
  42. for (i = 0; i < 7; i++)
  43. {
  44. str1[i] = str2[i];
  45. }
  46. for (i = 0; i < 7; i++)
  47. {
  48. cout << str1[i];
  49. }
  50. cout << str1.getLength() << endl;
  51. return 0;
  52. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/613135
推荐阅读
相关标签
  

闽ICP备14008679号