【C++】运算符重载 ⑦ ( 一元运算符重载 | 后置运算符重载 | 使用 全局函数 实现 后置 ++ 自增运算符重载 | 使用 成员函数 实现 后置 -- 自减运算符重载 )

雨点打透心脏的1/2处 2024-02-25 07:45 94阅读 0赞

文章目录

  • 一、后置运算符重载
    • 1、使用 全局函数 实现 后置 ++ 自增运算符重载
    • 2、使用 成员函数 实现 后置 — 自减运算符重载
  • 二、完整代码示例

上一篇博客 【C++】运算符重载 ⑥ ( 一元运算符重载 | 后置运算符重载 | 前置运算符重载 与 后置运算符重载 的区别 | 后置运算符重载添加 int 占位参数 ) 中 , 讲解了 前置运算符重载 与 后置运算符重载 的区别 ,

  • 前置运算符重载 : Student& operator++(Student& s) , 返回的是对象引用 , 参数正常 ;
  • 后置运算符重载 : Student operator++(Student& s, int) , 返回的事对象值 , 参数列表最后一位需要添加 int 类型的占位参数 ;

由此可见 , 后置运算符重载的难度高于前置运算符 ;

一、后置运算符重载


1、使用 全局函数 实现 后置 ++ 自增运算符重载

使用 全局函数 实现 后置 ++ 自增运算符重载 :

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

    operate++

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

    • 此处由于是一元运算符重载 , 只需要对本对象进行操作 , 需要传入对象本身作为参数 , 另外为了与前置运算符作区分 , 添加了 int 类型占位参数 ;

    operator++(Student& s, int)

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

    • 实现 1 个 Student 对象 自增运算 ;
    • 先使用 参数中的 Student& s 对象 , 再自增 ;
    • 因此 Student& s 对象是需要自增的 , 但是使用的对象 就是 返回的对象, 必须是没有自增的对象 ;
    • 这里使用 ret 保存 s 对象值 , 然后返回该 ret 值 , 这是没有自增的对象 ;
    • s 对象中的值需要自增 ;

    Student operator++(Student& s, int)

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

    // 使用 全局函数 实现 后置 ++ 自增运算符重载
    // 重载 后置 ++ 运算符
    // 实现 1 个 Student 对象 自增运算
    // 先使用 参数中的 Student& s 对象 , 再自增
    // 因此 Student& s 对象是需要自增的
    // 但是使用的对象 就是 返回的对象, 必须是没有自增的对象
    // 这里使用 ret 保存 s 对象值 , 然后返回该 ret 值
    // s 对象中的值自增
    // 返回的是一个新 Student 对象
    Student operator++(Student& s, int)
    {

    1. Student ret = s;
    2. s.age++;
    3. s.height++;
    4. return ret;

    };

2、使用 成员函数 实现 后置 – 自减运算符重载

使用 成员函数 实现 后置 – 自减运算符重载 :

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

    operate—

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

    • 此处由于是一元运算符重载 , 只需要对本对象进行操作 , 不需要将对象本身进行传入了 , 直接使用 this 指针操作对象 , 只添加 int 类型占位参数 ;

    operator—(int)

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

    • 实现 1 个 Student 对象 自减运算
    • 先使用 this 指针指向的对象 , 再自减 ;
    • 因此 this 指针指向的对象 是需要自减的 , 但是使用的对象 就是 返回的对象, 必须是没有自减的对象 ;
    • 这里使用 ret 保存 this 指针指向的对象值 , 然后返回该 ret 值 , 这是没有自减的对象值 ;
    • this 指针指向的对象值自减 ;

    Student operator—(int)

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

    public:

    1. // 使用 成员函数 实现 后置 -- 自减运算符重载
    2. // 重载 后置 -- 运算符
    3. // 实现 1 个 Student 对象 自减运算
    4. // 先使用 this 指针指向的对象 , 再自减
    5. // 因此 this 指针指向的对象 是需要自减的
    6. // 但是使用的对象 就是 返回的对象, 必须是没有自减的对象
    7. // 这里使用 ret 保存 this 指针指向的对象值 , 然后返回该 ret 值
    8. // this 指针指向的对象值自减
    9. // 返回的是一个新 Student 对象
    10. Student operator--(int)
    11. {
    12. Student ret = *this;
    13. this->age--;
    14. this->height--;
    15. return ret;
    16. };

二、完整代码示例


代码示例 :

  1. #include "iostream"
  2. using namespace std;
  3. class Student
  4. {
  5. public:
  6. // 带参构造函数 , 为参数设置默认值
  7. Student(int age = 1, int height = 1)
  8. {
  9. this->age = age;
  10. this->height = height;
  11. };
  12. public:
  13. // 打印类数据
  14. void print()
  15. {
  16. cout << "age = " << age << " , height = " << height << endl;
  17. };
  18. public:
  19. // 使用 成员函数 实现 后置 -- 自减运算符重载
  20. // 重载 后置 -- 运算符
  21. // 实现 1 个 Student 对象 自减运算
  22. // 先使用 this 指针指向的对象 , 再自减
  23. // 因此 this 指针指向的对象 是需要自减的
  24. // 但是使用的对象 就是 返回的对象, 必须是没有自减的对象
  25. // 这里使用 ret 保存 this 指针指向的对象值 , 然后返回该 ret 值
  26. // this 指针指向的对象值自减
  27. // 返回的是一个新 Student 对象
  28. Student operator--(int)
  29. {
  30. Student ret = *this;
  31. this->age--;
  32. this->height--;
  33. return ret;
  34. };
  35. public:
  36. int age; // 年龄
  37. int height; // 身高
  38. };
  39. // 使用 全局函数 实现 前置 ++ 自增运算符重载
  40. // 重载 前置 ++ 运算符
  41. // 实现 1 个 Student 对象 自增运算
  42. // 由于 参数中的 Student& s 中的属性发生了变化
  43. // 返回时仍需要返回 Student& s 参数本身
  44. Student& operator++(Student& s)
  45. {
  46. s.age++;
  47. s.height++;
  48. return s;
  49. };
  50. // 使用 全局函数 实现 后置 ++ 自增运算符重载
  51. // 重载 后置 ++ 运算符
  52. // 实现 1 个 Student 对象 自增运算
  53. // 先使用 参数中的 Student& s 对象 , 再自增
  54. // 因此 Student& s 对象是需要自增的
  55. // 但是使用的对象 就是 返回的对象, 必须是没有自增的对象
  56. // 这里使用 ret 保存 s 对象值 , 然后返回该 ret 值
  57. // s 对象中的值自增
  58. // 返回的是一个新 Student 对象
  59. Student operator++(Student& s, int)
  60. {
  61. Student ret = s;
  62. s.age++;
  63. s.height++;
  64. return ret;
  65. };
  66. int main() {
  67. // 自定义类型相加
  68. Student s1(10, 120), s2(18, 170);
  69. Student s3, s4, s5;
  70. ++s1;
  71. s1.print();
  72. s2++;
  73. s2.print();
  74. s2--;
  75. s2.print();
  76. // 控制台暂停 , 按任意键继续向后执行
  77. system("pause");
  78. return 0;
  79. };

执行结果 :

  1. age = 11 , height = 121
  2. age = 19 , height = 171
  3. age = 18 , height = 170
  4. 请按任意键继续. . .

在这里插入图片描述

发表评论

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

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

相关阅读