【C++】运算符重载 ⑪ ( 数组类 中 等号 = 运算符重载 | 函数原型 Array& operator=(Array& a) | 完整代码示例 )

梦里梦外; 2024-02-24 06:13 51阅读 0赞

文章目录

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

一、数组类 等号 = 运算符重载


1、数组类回顾

数组类 定义后 ,

如果 想要 使用 一个已存在的数组类对象 为 另外一个已存在的数组类对象 赋值 ,

就需要 重载 等号 = 运算符 ;

重载 等号 = 运算符 , 需要满足如下条件 :

  • 赋值功能 : 基本赋值功能 ;
  • 深拷贝 : 拷贝赋值 需要是 深拷贝 ;
  • 返回引用类型 : 等号运算 是 右结合 的 , a = b = c 代码 , 先执行 b = c , 然后再执行 a = (b = c) , 可见 等号运算符 的返回值 也要是一个相同类型的对象 , 该对象必须是引用类型 , 否则返回的是一个匿名对象 ;

2、等号 = 运算符重载

使用 成员函数 实现 等号 = 运算符重载 :

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

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

    operate=

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

    • 要对 Array a 对象 , 使用 = 运算符 , 使用时用法为 a = a1 ;
    • 左操作数 : 其中 左操作数 是 Array a , 这里通过 this 指针调用 , 不需要声明在参数中 ;
    • 右操作数 : 右操作数 是 Array a1 ; 该操作数需要声明在参数中 , 注意需要声明 引用类型 ;
    • 上述两个是对象类型 , 对象一般传入 指针 或 引用 , 这里传入引用类型 ;

    operator=(Array& a)

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

    • 等号运算 是 右结合 的 , a = b = c 代码 , 先执行 b = c , 然后再执行 a = (b = c) , 可见 等号运算符 的返回值 也要是一个相同类型的对象 , 该对象必须是引用类型 , 否则返回的是一个匿名对象 ;

    Array& operator=(Array& a)

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

    • 先释放本身的内存空间 ;
    • 再根据右操作数 ( 参数 ) 数据重新进行内存分配 , 并赋值 ;
    • 最后 , 返回自身引用 ;

    // 等号 = 操作符重载
    Array& Array::operator=(Array& a)
    {

    1. if (this->m_space != NULL)
    2. {
    3. // 释放 new int[m_length] 分配的内存
    4. delete[] this->m_space;
    5. this->m_space = NULL;
    6. }
    7. // 设置数组长度
    8. this->m_length = a.m_length;
    9. // 创建数组
    10. this->m_space = new int[m_length];
    11. // 为数组赋值
    12. for (int i = 0; i < m_length; i++)
    13. {
    14. this->m_space[i] = a.m_space[i];
    15. }
    16. cout << " 调用 等号 = 操作符重载 函数" << endl;
    17. // 返回是引用类型
    18. // 返回引用就是返回本身
    19. // 将 this 指针解引用, 即可获取数组本身
    20. return *this;

    }

二、完整代码示例


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. // 等号 = 操作符重载
  26. Array& operator=(Array& a);
  27. private:
  28. // 数组长度
  29. int m_length;
  30. // 指向数组数据内存 的指针
  31. int* m_space;
  32. };

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. }
  66. // 等号 = 操作符重载
  67. Array& Array::operator=(Array& a)
  68. {
  69. if (this->m_space != NULL)
  70. {
  71. // 释放 new int[m_length] 分配的内存
  72. delete[] this->m_space;
  73. this->m_space = NULL;
  74. }
  75. // 设置数组长度
  76. this->m_length = a.m_length;
  77. // 创建数组
  78. this->m_space = new int[m_length];
  79. // 为数组赋值
  80. for (int i = 0; i < m_length; i++)
  81. {
  82. this->m_space[i] = a.m_space[i];
  83. }
  84. cout << " 调用 等号 = 操作符重载 函数" << endl;
  85. // 返回是引用类型
  86. // 返回引用就是返回本身
  87. // 将 this 指针解引用, 即可获取数组本身
  88. return *this;
  89. }

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(3);
  20. Array array3(3);
  21. // 调用重载的等号运算符
  22. array3 = array2 = array;
  23. // 打印 array2 数组值
  24. for (int i = 0; i < array3.length(); i++)
  25. {
  26. //cout << array3.getData(i) << endl;
  27. cout << array3[i] << endl;
  28. }
  29. // 控制台暂停 , 按任意键继续向后执行
  30. system("pause");
  31. return 0;
  32. }

4、执行结果

执行结果 :

  1. 调用有参构造函数
  2. 5
  3. 6
  4. 7
  5. 调用有参构造函数
  6. 调用有参构造函数
  7. 调用 等号 = 操作符重载 函数
  8. 调用 等号 = 操作符重载 函数
  9. 5
  10. 6
  11. 7
  12. Press any key to continue . . .

在这里插入图片描述

发表评论

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

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

相关阅读