鱼C论坛

 找回密码
 立即注册
查看: 2013|回复: 0

[学习笔记] 033-C++之运算符重载2

[复制链接]
发表于 2018-9-2 20:35:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、重载= 内存泄露场景
类中有挂了内存块的指针成员,在使用下面的=重载时,会造成内存泄露,十分隐蔽
  1. void operator=(name &obj)
  2. {
  3.         char *pn = obj.GetPn();  
  4.         //if (pname != NULL)  delete[] pname;  //如果没有此句,会造成内存泄漏
  5.         pname = new char[strlen(pn) + 1];
  6.         if (pname != NULL)  strcopy(pname, pn);
  7.         // delete[] pn;     
  8.         size = strlen(pn);
  9. }
复制代码

2、[]  =  ==  !=   操作符的重载
使用 .h 和 .cpp 类的定义和实现 分离的方式完成上述操作符的重载,以及测试。
Array.h
  1. #pragma once

  2. class Array
  3. {
  4. private:
  5.         int mLength;
  6.         int* mSpace;

  7. public:
  8.         Array(int length);
  9.         Array(const Array& obj);
  10.         int length();
  11.         void setData(int index, int value);
  12.         int getData(int index);
  13.         ~Array();

  14. // []  =  ==  !=   项目中的难点
  15.         int& operator[](int i);         // [] 重载
  16.         Array& operator=(Array &a2);    // = 重载
  17.         bool operator==(Array &a2);     // == 重载
  18.         bool operator!=(Array &a2);     // != 重载

  19. };
复制代码

Arraycpp.cpp
  1. #include "iostream"
  2. #include "Array.h"
  3. using namespace std;

  4. Array::Array(int length)
  5. {
  6.         if (length < 0)
  7.         {
  8.                 length = 0;
  9.         }
  10.         mLength = length;
  11.         mSpace = new int[mLength];
  12. }

  13. Array::Array(const Array& obj)
  14. {
  15.         mLength = obj.mLength;
  16.         mSpace = new int[mLength];

  17.         for (int i = 0; i < mLength; i++)
  18.         {
  19.                 mSpace[i] = obj.mSpace[i];
  20.         }
  21. }

  22. int Array::length()
  23. {
  24.         return mLength;
  25. }

  26. void Array::setData(int index, int value)
  27. {
  28.         mSpace[index] = value;
  29. }

  30. int Array::getData(int index)
  31. {
  32.         return mSpace[index];
  33. }

  34. Array::~Array()
  35. {
  36.         mLength = -1;
  37.         delete[] mSpace;
  38. }

  39. // [] 重载的实现     // 为了实现返回值当左值,需要返回应用
  40. int& Array::operator[](int i)
  41. {
  42.         return mSpace[i];
  43. }

  44. //Array a3(100);
  45. //a3 = a2;        // = 重载
  46. // 1) 如果a3已经分配内存则需要释放
  47. // 2) 根据a2开辟内存空间 把a2的值copy到a3中
  48. Array& Array::operator=(Array &a2)     // 如果返回值不加引用,这里会多执行一次copy构造函数创建一个匿名对象, 场景4
  49. {                                      // 需要返回值当左值,必须返回一个引用
  50.         if (this->mSpace != NULL)
  51.         {
  52.                 delete[] mSpace;
  53.                 mSpace = NULL;
  54.                 mLength = 0;
  55.         }
  56.         this->mLength = a2.mLength;
  57.         this->mSpace = new int[this->mLength];

  58.         for (int i = 0; i < this->mLength; i++)
  59.         {
  60.                 mSpace[i] = a2[i];
  61.         }
  62.         return *this;
  63. }

  64. // == 重载
  65. bool Array::operator==(Array &a2)
  66. {
  67.         // 先判断a1和a2的长度是否相等
  68.         // a1,a2中每个元素是否相等
  69.         if (this->mLength != a2.mLength)
  70.         {
  71.                 return false;
  72.         }

  73.         for (int i = 0; i < this->mLength; i++)
  74.         {
  75.                 if (this->mSpace[i] != a2[i])
  76.                 {
  77.                         return false;
  78.                 }
  79.         }
  80.         return true;
  81. }

  82. bool Array::operator!= (Array &a2)
  83. {
  84.         return !(*this==a2);  // 运算符重载也是一个函数

  85. }
复制代码

测试:ArrayTest.cpp
  1. #include "iostream"
  2. #include "Array.h"
  3. using namespace std;

  4. int main()
  5. {
  6.         Array a1(10), a3(10);

  7.         for (int i = 0; i < a1.length(); i++)
  8.         {
  9.                 //a1.setData(i, i);         // 想换成 a1[i] = i(函数返回值做左值)     [] 重载
  10.                 // int& operator[](int i)   // 函数返回值做左值 ===>   需要函数返回引用
  11.                 a1[i] = i;              
  12.         }

  13.         for (int i = 0; i < a1.length(); i++)
  14.         {
  15.                 //printf("array %d: %d \n", i, a1.getData(i));
  16.                 cout << a1[i] << endl;
  17.         }

  18.         Array a2 = a1;   // 初始化 执行拷贝构造函数

  19.         for (int i = 0; i < a2.length(); i++)
  20.         {
  21.                 printf("array %d: %d \n", i, a2.getData(i));
  22.         }

  23.         if (a2 == a1)     // == 重载
  24.         {
  25.                 printf("相等\n");
  26.         }

  27.         if (a3 != a1)     // == 重载
  28.         {
  29.                 printf("不相等\n");
  30.         }

  31.         Array a4(100);
  32.         // 连等操作
  33.         a1 = a4 = a2;      // = 重载   (函数返回值做左值)
  34.         //a1.operator=(a3,operator=(a2));  与上面的语句等同

  35.         system("pause");
  36.         return 0;
  37. }
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-22 08:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表