【C++】运算符重载 ⑩ ( 下标 [] 运算符重载 | 函数原型 int& operator[](int i) | 完整代码示例 )

墨蓝 2024-02-25 02:03 117阅读 0赞

文章目录

  • 一、下标 [] 运算符重载
    • 1、数组类回顾
    • 2、下标 [] 运算符重载
  • 二、完整代码示例
    • 1、Array.h 数组头文件
    • 2、Array.cpp 数组实现类
    • 3、Test.cpp 测试类
    • 4、执行结果

一、下标 [] 运算符重载


1、数组类回顾

在之前的博客 【C++】面向对象示例 - 数组类 ( 示例需求 | 创建封装类 | 数组类头文件 Array.h | 数组类实现 Array.cpp | 测试类 Test.cpp - 主函数入口 ) 中 , 实现了一个数组类 , 在一个类中 , 封装了一个 int 类型的指针 , 该指针指向堆内存的 内存空间 , 用于存放一个数组 ;

核心是 2 2 2 个成员变量 , 记录指向堆内存的指针 , 和 数组长度 ;

  1. private:
  2. // 数组长度
  3. int m_length;
  4. // 指向数组数据内存 的指针
  5. int* m_space;

数组都可以使用下标进行访问 , 如果要使用下标访问 自定义 Array 类对象 , 需要重载 [] 下标运算符 ;

下面基于 博客 【C++】面向对象示例 - 数组类 ( 示例需求 | 创建封装类 | 数组类头文件 Array.h | 数组类实现 Array.cpp | 测试类 Test.cpp - 主函数入口 ) 中 的代码 , 重载 数组下标 [] 操作符 ;

2、下标 [] 运算符重载

使用 成员函数 实现 下标 [] 运算符重载 :

  • 首先 , 写出函数名 , 函数名规则为 “ operate “ 后面跟上要重载的运算符 ,

    • 要对 Array a 对象 , 使用 [] 运算符 , 使用时用法为 a[i] ;
    • 函数名是 operate[] ;

    operate[]

  • 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;

    • 要对 Array a 对象 , 使用 [] 运算符 , 使用时用法为 a[i] ,
    • 左操作数 : 其中 左操作数 是 a ,
    • 右操作数 : 运算符里面还有一个 int 类型的索引值 , 是右操作数 ;
    • 如果是成员函数 , 则将重载函数写在 左操作数 中 , 在 重载操作数的 成员函数中 this 指针就是 左操作数 ;
    • 此时只需要额外指定一个 int 类型右操作数 即可 ;

    operator

  • 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;

    • 要对 Array a 对象 , 使用 [] 运算符 , 使用时用法为 a[i] ;
    • a[i] 除了获取值之外 , 还要可以设置值 ;
    • a[i] 既可以作为左值 , 又要可以作为右值使用 ;
    • 因此返回值必须是 int 值本身 , 如果返回 int 值就只是一个副本值 没有意义 , 这里返回 int& 引用类型 ;

    int& operator

  • 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;

    // 数组下标 [] 操作符重载
    int& Array::operator
    {

    1. return m_space[i];

    }

在测试类中 , 使用数组下标为数组设置值 , 并使用数组下标操作符获取数组元素的值 ;

  1. Array array(3);
  2. // 设置 array 数组值
  3. for (int i = 0; i < array.length(); i++)
  4. {
  5. //array.setData(i, i + 5);
  6. array[i] = i + 5;
  7. }
  8. // 打印 array 数组值
  9. for (int i = 0; i < array.length(); i++)
  10. {
  11. //cout << array.getData(i) << endl;
  12. cout << array[i] << endl;
  13. }

二、完整代码示例


1、Array.h 数组头文件

  1. #pragma once
  2. #include "iostream"
  3. using namespace std;
  4. class Array
  5. {
  6. public:
  7. // 无参构造函数
  8. Array();
  9. // 有参构造函数
  10. Array(int len);
  11. // 拷贝构造函数
  12. Array(const Array& array);
  13. // 析构函数
  14. ~Array();
  15. public:
  16. // 设置数组数据
  17. void setData(int index, int value);
  18. // 获取数组数据
  19. int getData(int index);
  20. // 获取数组长度
  21. int length();
  22. public:
  23. // 数组下标 [] 操作符重载
  24. int& operator[](int i);
  25. private:
  26. // 数组长度
  27. int m_length;
  28. // 指向数组数据内存 的指针
  29. int* m_space;
  30. };

2、Array.cpp 数组实现类

  1. #include "Array.h"
  2. // 无参构造函数
  3. Array::Array()
  4. {
  5. // 设置数组长度
  6. m_length = 10;
  7. // 为数组在堆内存中分配内存
  8. m_space = new int[m_length];
  9. cout<< " 调用无参构造函数 " << endl;
  10. }
  11. // 有参构造函数
  12. Array::Array(int len)
  13. {
  14. // 设置数组长度
  15. m_length = len;
  16. // 为数组在堆内存中分配内存
  17. m_space = new int[m_length];
  18. cout << " 调用有参构造函数 " << endl;
  19. }
  20. // 拷贝构造函数
  21. // 这是一个深拷贝 拷贝构造函数
  22. Array::Array(const Array& array)
  23. {
  24. // 设置数组长度
  25. m_length = array.m_length;
  26. // 创建数组
  27. m_space = new int[m_length];
  28. // 为数组赋值
  29. for (int i = 0; i < m_length; i++)
  30. {
  31. m_space[i] = array.m_space[i];
  32. }
  33. cout << " 调用拷贝构造函数 " << endl;
  34. }
  35. // 析构函数
  36. Array::~Array()
  37. {
  38. if (m_space != NULL)
  39. {
  40. // 释放 new int[m_length] 分配的内存
  41. delete[] m_space;
  42. m_space = NULL;
  43. }
  44. cout << " 调用析构函数 " << endl;
  45. }
  46. // 设置数组数据
  47. void Array::setData(int index, int value)
  48. {
  49. m_space[index] = value;
  50. }
  51. // 获取数组数据
  52. int Array::getData(int index)
  53. {
  54. return m_space[index];
  55. }
  56. // 获取数组长度
  57. int Array::length()
  58. {
  59. return m_length;
  60. }
  61. // 数组下标 [] 操作符重载
  62. int& Array::operator[](int i)
  63. {
  64. return m_space[i];
  65. }

3、Test.cpp 测试类

  1. #include "iostream"
  2. using namespace std;
  3. #include "Array.h"
  4. int main() {
  5. Array array(3);
  6. // 设置 array 数组值
  7. for (int i = 0; i < array.length(); i++)
  8. {
  9. //array.setData(i, i + 5);
  10. array[i] = i + 5;
  11. }
  12. // 打印 array 数组值
  13. for (int i = 0; i < array.length(); i++)
  14. {
  15. //cout << array.getData(i) << endl;
  16. cout << array[i] << endl;
  17. }
  18. // 使用拷贝构造函数 赋值
  19. Array array2 = array;
  20. // 打印 array2 数组值
  21. for (int i = 0; i < array2.length(); i++)
  22. {
  23. //cout << array2.getData(i) << endl;
  24. cout << array2[i] << endl;
  25. }
  26. // 控制台暂停 , 按任意键继续向后执行
  27. system("pause");
  28. return 0;
  29. }

4、执行结果

执行结果 :

  1. 调用有参构造函数
  2. 5
  3. 6
  4. 7
  5. 调用拷贝构造函数
  6. 5
  7. 6
  8. 7
  9. 请按任意键继续. . .

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,117人围观)

还没有评论,来说两句吧...

相关阅读