为构建清朗、和谐、绿色、健康的网络环境,维护网络文明秩序,保障用户合法权益,菜鸟资源平台依据并贯彻《中华人民共和国民法典》、《中华人民共和国网络安全法》、《中华人民共和国个人信息保护法》、《中华人民共和国未成年人保护法》、《中华人民共和国预防未成年人犯罪法》、《网络信息内容生态治理规定》等相关法律法规及主管部门的管理政策,与用户共同制定《菜鸟资源平台自律公约》(以下简称“本公约”)。 立即查看
通知图标

正在访问 第十一章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

第十一章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

第十一章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

运算符重载是一种技术,可以使我们为自定义数据类型(类或结构体)定义特定的运算符行为。通过运算符重载,我们可以使用与内置数据类型相同的语法和形式来操作自定义数据类型,从而提高代码的可读性和整洁性。 以下是运算符重载的一些优点: 提高代码可读性...

当前版本

软件大小

软件语言

是否破解

运算符重载是一种技术,可以使我们为自定义数据类型(类或结构体)定义特定的运算符行为。通过运算符重载,我们可以使用与内置数据类型相同的语法和形式来操作自定义数据类型,从而提高代码的可读性和整洁性。

以下是运算符重载的一些优点:

  1. 提高代码可读性:运算符重载使得自定义数据类型的操作更加直观,从而使代码更易于理解和维护。
  2. 代码整洁性:通过运算符重载,我们可以简化代码,使其更符合数学或其他领域的表达习惯。例如,在实现一个复数类时,通过重载加法运算符,我们可以直接使用 “+” 来表示复数的加法,而不需要调用特定的成员函数。
  3. 一致性:运算符重载提供了一种与内置数据类型相同的操作方式,使得自定义数据类型的操作更加一致。

    此外,运算符重载还可以提高代码的复用性和灵活性。例如,我们可以定义一个运算符来执行两个自定义数据类型的加法操作,然后在不同的类或结构体中使用这个运算符。这使得代码更加模块化和可维护,同时也提高了代码的复用性。

    需要注意的是,运算符重载并不是万能的。过度使用或不当使用运算符重载可能会导致代码难以理解和维护。因此,在使用运算符重载时,应该遵循一些原则和规范,例如尽量保持原有的运算符功能和语义,避免定义与原有功能相似的运算符等。

    总之,运算符重载是一种强大的技术,可以使我们在编写自定义数据类型时更加灵活和高效。但是,在使用时应该谨慎和规范,以确保代码的可读性和可维护性。

第十一章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

 

接着上一章节继续:第十章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人 – 菜鸟资源 (xiciw.com)

正文讲解开始 今天我们讲解的是运算符重载提高篇

6.5. 运算符重载提高篇

  6.5.1. 函数操作符(()仿函数

  把类对象像函数名一样使用。

         仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一 个 operator(),这个类就有了类似函数的行为,就是一个仿函数类了。  格式

  1. class 类名
  2. {
  3. 返值类型 operator()(参数类型)
  4. 函数体
  5. }

 应用

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. class Sqr
  5. {
  6. public:
  7. int operator()(int i)
  8. {
  9. return i*i;
  10. }
  11. double operator ()(double d)
  12. {
  13. return d*d;
  14. }
  15. };
  16. int main()
  17. {
  18. Sqr sqr;
  19. int i = sqr(4); //sqr.opreator()(4);
  20. double d = sqr(5.5); //sqr.operator()(5.5);
  21. cout<<i<<endl;
  22. cout<<d<<endl;
  23. return 0;
  24. }

注:

主要应用于 STL 和模板,后续会讲。

6.5.2. 堆内存操作符 (new delete

适用于极个别情况需要定制的时候才用的到。一般很少用。

 格式如下:

  1. operator new
  2. operator delete
  3. operator new[]
  4. operator delete[]

 全局重载

  1. void * operator new (size_t size)
  2. {
  3. cout<<"new "<<size<<endl;
  4. return malloc(size);
  5. }
  6. void operator delete(void *p)
  7. {
  8. cout<<"delete"<<endl;
  9. free(p);
  10. }
  11. void * operator new[] (size_t size)
  12. {
  13. cout<<"new[] "<<size<<endl;
  14. return malloc(size);
  15. }
  16. void operator delete[](void *p)
  17. {
  18. cout<<"delete[] "<<endl;
  19. free(p);
  20. }

测试:

  1. class A
  2. {
  3. public:
  4. A()
  5. {
  6. cout<<"A constructor"<<endl;
  7. }
  8. ~A()
  9. {
  10. cout<<"A destructor"<<endl;
  11. }
  12. private:
  13. int a;
  14. };
  15. int main()
  16. {
  17. int *p = new int;
  18. delete p;
  19. int *pa = new int[20];
  20. delete []pa;
  21. A * cp = new A;
  22. delete cp;
  23. A * cpa = new A[20];
  24. delete []cpa;
  25. return 0;
  26. }

 类中重载

  1. class A
  2. {
  3. public:
  4. A()
  5. {
  6. cout<<"A constructor"<<endl;
  7. }
  8. ~A()
  9. {
  10. cout<<"A destructor"<<endl;
  11. }
  12. void * operator new (size_t size)
  13. {
  14. cout<<"new "<<size<<endl;
  15. return malloc(size);
  16. }
  17. void operator delete(void *p)
  18. {
  19. cout<<"delete"<<endl;
  20. free(p);
  21. }
  22. void * operator new[] (size_t size)
  23. {
  24. cout<<"new[] "<<size<<endl;
  25. return malloc(size);
  26. }
  27. void operator delete[](void *p)
  28. {
  29. cout<<"delete[] "<<endl;
  30. free(p);
  31. }
  32. private:
  33. int a;
  34. };
  35. int main()
  36. {
  37. // int *p = new int;
  38. // delete p;
  39. // int *pa = new int[20];
  40. // delete []pa;
  41. A * cp = new A;
  42. delete cp;
  43. A * cpa = new A[20];
  44. delete []cpa;
  45. return 0;
  46. }

6.5.3. 解引用与智能指针(-> /*

常规意义上讲,new 或是 malloc 出来的堆上的空间,都需要手动 delete 和 free 的。但在其它高级语言中,只需申请无需释放的功能是存在的。

c++中也提供了这样的机制。我们先来探究一下实现原理。

 常规应用

  1. class A
  2. {
  3. public:
  4. A()
  5. {
  6. cout<<"A()"<<endl;
  7. }
  8. ~A()
  9. {
  10. cout<<"~A()"<<endl;
  11. }
  12. void func()
  13. {
  14. cout<<"hahaha"<<endl;
  15. }
  16. };
  17. void foo()
  18. {
  19. A*p = new A;
  20. //
  21. delete p;
  22. }

 智能指针

  1. #include <memory>
  2. void foo()
  3. {
  4. auto_ptr<A> p (new A);
  5. p->func();
  6. (*p).func();
  7. }

 推演

1st step

  1. class A
  2. {
  3. public:
  4. A()
  5. {
  6. cout<<"A constructor"<<endl;
  7. }
  8. ~A()
  9. {
  10. cout<<"A destructor"<<endl;
  11. }
  12. };
  13. class PMA
  14. {
  15. public:
  16. PMA(A *p)
  17. :_p(p){}
  18. ~PMA()
  19. {
  20. delete _p;
  21. }
  22. private:
  23. A * _p;
  24. };
  25. int main()
  26. {
  27. A * p = new A;
  28. PMA pma(new A);
  29. return 0;
  30. }

2sd step

  1. #include <iostream>
  2. #include <memory>
  3. using namespace std;
  4. class A
  5. {
  6. public:
  7. A()
  8. {
  9. cout<<"A constructor"<<endl;
  10. }
  11. ~A()
  12. {
  13. cout<<"A destructor"<<endl;
  14. }
  15. void dis()
  16. {
  17. cout<<"in class A's dis"<<endl;
  18. }
  19. };
  20. class PMA
  21. {
  22. public:
  23. PMA(A *p)
  24. :_p(p){}
  25. ~PMA()
  26. {
  27. delete _p;
  28. }
  29. A& operator*()
  30. {
  31. return *_p;
  32. }
  33. A* operator->()
  34. {
  35. return _p;
  36. }
  37. private:
  38. A * _p;
  39. };
  40. int main()
  41. {
  42. A * p = new A;
  43. PMA pma(new A);
  44. // pma._p->dis(); private 的原因破坏了封装
  45. (*pma).dis();
  46. pma->dis();
  47. return 0;
  48. }

 ->和* 重载格式

  1. 类名& operator*()
  2. {
  3. 函数体
  4. }
  1. 类名* operator->()
  2. {
  3. 函数体
  4. }

6.6. 作业

6.6.1. 设计TDate

定义一个处理日期的类 TDate,它有 3 个私有数据成员:Month,Day,Year 和若干个公有成员函数,并实现如下要求:

①构造函数重载

②成员函数设置缺省参数

③可使用不同的构造函数来创建不同的对象

④定义一个友元函数来打印日期

6.6.2. 设计一个矩阵类

设计一个 3*3 的矩阵类 class Matrix,通过一数组进行初始化。要求如下:

①默认构造(初始化为 0),有参构造(数组作实参)

②重载+ / +=

③重载* / *=

④实现输出

提示:

  1. class Matrix
  2. {
  3. public:
  4. Matrix(void);
  5. Matrix(int p[][3]);
  6. private:
  7. int data[3][3];
  8. };

本章完,下一章我们讲解:继承与派生(Inherit&&Derive)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

常见问题

  • 如何安装和激活?

    每款软件会附带有安装教程,您打开安装包一目了然

  • 程序是否已损坏?文件损坏?还是其他错误?

    有错误问题,请您参考:https://www.xxx.com/error

  • 如何更新?正式激活后会发生什么情况?

    除非安装说明中另有说明,否则官方更新可能会导致无法激活。 要从本网站更新软件,您需要在此处下载此软件的新版本(如果可用),并将其安装在计算机上安装的版本之上(替换)。在这种情况下,您将保存此软件的激活和设置。

  • 如何下载?链接不起作用?

    我们使用百度网盘,132云盘和微软网盘,除了百度网盘,其他两款不限速,如果链接失效,请您联系客服处理

  • 已发布更新。我什么时候升级我的版本?

    所有软件如有更新,我们第一时间推送,视自己情况更新使用

  • 如何更改语言?

    打开“系统偏好设置”->“通用>语言和地区”->应用程序-“+”。 选择应用和语言。此方法适用于大多数应用程序。 Adobe 产品中的语言通常是在产品本身的安装阶段选择的。 游戏中的语言通常会在游戏本身的设置中发生变化。

  • 如何删除软件?

    有很多选择。最简单的方法是使用特殊的实用程序来卸载应用程序,例如App Cleaner Uninstaller 要删除 Adobe 产品,请使用 Creative Cloud Cleaner Tool

  • 需要远程帮助吗?

    网站已开通永久会员的可享受免费远程,如果非永久会员,远程安装另外收费

点点赞赏,手留余香

给TA打赏
共0人
还没有人赞赏,快来当第一个赞赏的人吧!
    技术教程

    第十章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

    2024-1-31 14:01:05

    技术教程

    第十二章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

    2024-2-1 9:49:57

    0 条回复 A文章作者 M管理员
    惟沉默是最高的轻蔑
    欢迎您,新朋友,感谢参与互动!
      暂无讨论,说说你的看法吧
    后退
    榜单