page contents

C++重载[](下标运算符)详细解释

C++ 规定,下标运算符[ ]必须以成员函数的形式进行重载。

C++ 规定,下标运算符[ ]必须以成员函数的形式进行重载。该重载函数在类中的声明格式如下:

返回值类型 & operator[ ] (参数);

或者:

const 返回值类型 & operator[ ] (参数) const;

使用第一种声明方式,[ ]不仅可以访问元素,还可以修改元素。使用第二种声明方式,[ ]只能访问而不能修改元素。在实际开发中,我们应该同时提供以上两种形式,这样做是为了适应 const 对象,因为通过 const 对象只能调用 const 成员函数,如果不提供第二种形式,那么将无法访问 const 对象的任何元素。

下面我们通过一个具体的例子来演示如何重载[ ]。我们知道,有些较老的编译器不支持变长数组,例如 VC6.0、VS2010 等,这有时候会给编程带来不便,下面我们通过自定义的 Array 类来实现变长数组。



  1. #include <iostream>

  2. using namespace std;

  3. classArray{

  4. public:

  5. Array(int length = 0);

  6. ~Array();

  7. public:

  8. int & operator[](int i);

  9. const int & operator[](int i) const;

  10. public:

  11. int length() const { return m_length; }

  12. void display() const;

  13. private:

  14. int m_length;  //数组长度

  15. int *m_p;  //指向数组内存的指针

  16. };

  17. Array::Array(int length): m_length(length){

  18. if(length == 0){

  19. m_p = NULL;

  20. }else{

  21. m_p = new int[length];

  22. }

  23. }

  24. Array::~Array(){

  25. delete[] m_p;

  26. }

  27. int& Array::operator[](int i){

  28. return m_p[i];

  29. }

  30. const int & Array::operator[](int i) const{

  31. return m_p[i];

  32. }

  33. void Array::display() const{

  34. for(int i = 0; i < m_length; i++){

  35. if(i == m_length - 1){

  36. cout<<m_p[i]<<endl;

  37. }else{

  38. cout<<m_p[i]<<", ";

  39. }

  40. }

  41. }

  42. int main(){

  43. int n;

  44. cin>>n;

  45. ArrayA(n);

  46. for(int i = 0, len = A.length(); i < len; i++){

  47. A[i] = i * 5;

  48. }

  49. A.display();

  50. const ArrayB(n);

  51. cout<<B[n-1]<<endl;  //访问最后一个元素

  52. return 0;

  53. }

运行结果:
5↙
0, 5, 10, 15, 20
33685536

重载[ ]运算符以后,表达式arr[i]会被转换为:

arr.operator[ ](i);

需要说明的是,B 是 const 对象,如果 Array 类没有提供 const 版本的operator[ ],那么第 60 行代码将报错。虽然第 60 行代码只是读取对象的数据,并没有试图修改对象,但是它调用了非 const 版本的operator[ ],编译器不管实际上有没有修改对象,只要是调用了非 const 的成员函数,编译器就认为会修改对象(至少有这种风险)。

attachments-2021-04-lOKWTWmk608bc4621d4db.jpg

  • 发表于 2021-04-30 16:49
  • 阅读 ( 570 )
  • 分类:C/C++开发

0 条评论

请先 登录 后评论
小柒
小柒

1470 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章