c++语言并不要求递增和递减运算符必须是类的成员,但是因为它们改变的正好是所操作对象的状态,所以建议将其设定为成员函数。(但下面的代码为了练习,还是分别采用成员函数和全局函数的方式实现)

业余实现代码:

 1 #include<iostream>
 2 using namespace std;
 3 class Test {
 4     friend Test & operator--(Test &obj);
 5     friend Test operator--(Test &obj, int);
 6 public:
 7     Test(int a = 0, int b = 0)
 8     {
 9         this->a = a;
10         this->b = b;
11     }
12     void display()
13     {
14         cout << "a:" << a << " b:" << b << endl;
15     }
16 public:
17     //前置++
18     Test & operator++()
19     {
20         this->a++;
21         this->b++;
22         return *this;
23     }
24     //后置++
25     Test operator++(int)
26     {
27         Test temp = *this;
28         this->a++;
29         this->b++;
30         return temp;
31     }
32 private:
33     int a;
34     int b;
35 };
36 //前置--
37 Test & operator--(Test &obj)
38 {
39     obj.a--;
40     obj.b--;
41     return obj;
42 }
43
44 //后置--
45 Test operator--(Test &obj,int)
46 {
47     Test temp = obj;
48     obj.a--;
49     obj.b--;
50     return temp;
51 }
52 int main()
53 {
54     Test t1(1, 2);
55     t1.display();
56     ++t1;
57     t1.display();
58     --t1;
59     t1.display();
60     Test t2(3, 4);
61     t2.display();
62     t2++;
63     t2.display();
64     t2--;
65     t2.display();
66     cout << "hello world!\n";
67     return 0;
68 }

NOTE:

后置版本接受一个额外的参数(不被使用)int类型的参数(必须是int类型的)。当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参。尽管从语法上说后置函数可以使用这个额外的形参,但在实际过程中通常不会这样做。这个形参的唯一作用就是区分前置和后置版本的函数,而不是真的要在实现后置版本是参与运算。因为前置和后置版本的递增或者递减函数原型必须加以一个特殊的区分,c++语言选择增加一个占位参数实现后置版本。

如果我们想要通过函数的方式调用后置版本,则必须为它的整形参数传递一个值。

eg:

a.operator++(0);//调用后置版本,经测试,不用0也行,只要可以转换成int的任意数。

a.operator++();//调用前置版本

专业软件工程师实现方法:

 1 #include<iostream>
 2 using namespace std;
 3 class Test {
 4     friend Test & operator--(Test &obj);
 5     friend Test operator--(Test &obj, int);
 6 public:
 7     Test(int a = 0, int b = 0)
 8     {
 9         this->a = a;
10         this->b = b;
11     }
12     void display()
13     {
14         cout << "a:" << a << " b:" << b << endl;
15     }
16 public:
17     //前置++
18     Test & operator++()
19     {
20         this->a++;
21         this->b++;
22         return *this;
23     }
24     //后置++
25     Test operator++(int)
26     {
27         Test temp = *this;
28         ++*this;
29         return temp;
30     }
31 private:
32     int a;
33     int b;
34 };
35 //前置--
36 Test & operator--(Test &obj)
37 {
38     obj.a--;
39     obj.b--;
40     return obj;
41 }
42
43 //后置--
44 Test operator--(Test &obj,int)
45 {
46     Test temp = obj;
47     --obj;
48     return temp;
49 }
50 int main()
51 {
52     Test t1(1, 2);
53     t1.display();
54     ++t1;
55     t1.display();
56     --t1;
57     t1.display();
58     Test t2(3, 4);
59     t2.display();
60     t2++;
61     t2.display();
62     t2--;
63     t2.display();
64     cout << "hello world!\n";
65     return 0;
66 }

同样的思路在==和!=中也会用到(善于利用现有资源)^_^。

c++重载后置++和--相关推荐

  1. C++中前置操作符和后置操作符的重载

    文章目录 1 C++中前置操作符和后置操作符的重载 1.1 前置操作符和后置操作符的原生语义 1.2 ++操作符的重载 1.3 前置++和后置++的真正区别 1 C++中前置操作符和后置操作符的重载 ...

  2. C++回顾之前置++、后置++、不等号!及赋值运算符重载

    运算符重载的主要目的是为了让类对象能像普通数据类型一样能够进行加减乘除,自加自减等操作,非常直观方便.现在来回顾C++的自加减(分前置与后置)以及不等号非运算符,赋值运算符的重载. 1 ++重载 (1 ...

  3. 【C++深度剖析教程19】前置操作符与后置操作符

    今天来学习C++中的前置操作符(++i)与后置操作符(i++). 一回顾 以前在C语言的理论课程中,我们就学过,前置和后置操作符,有一定的区别: 但是我们可以看到下图,发现前置和后置++的操作符所对应 ...

  4. 40 - 前置操作符和后置操作符

    ---- 整理自狄泰软件唐佐林老师课程 1. 问题 下面代码的区别?why? 1.1 编程实验 汇编中的处理是一样的,所以不可能从编译后的二进制程序还原 ++i 还是 i++ 1.2 事实 现代编译器 ...

  5. # c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符...

    c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符 标签(空格分隔): c++ 前言 我在c++学习的过程中, 对这几个不太常见的运算符重载不太会写.出现了很 ...

  6. c++重载自增与自减运算符(前置与后置)

    运算符重载 要点: 1. 后置的运算符要带一个整型参数(用来与前置运算符区分开). 2.后置的返回值不要用引用(否则会因为是局部变量导致返回为一个不存在的值). 3.再在置中要定义一个临时变量来返回之 ...

  7. 运算符重载(加减运算符、前置加加(减减)后置加加(减减)运算符、赋值运算符、输入输出运算符、关系运算符、函数调用)

    编译器对于一个类会默认生成以几种函数: 1.默认构造函数(空形参,空函数体) 2.默认拷贝构造函数(浅拷贝,也叫值拷贝.字节拷贝) 3.析构函数(空形参,空函数体.析构函数要求形参列表必须是空的,所以 ...

  8. c++中运算符重载(加号运算,左移运算,前置后置++运算符,赋值运算,关系运算,函数运算)

    运算符重载注意 重载的运算符要易读 内置的数据类型的表达式的运算符是不可以改变的 不要重载&& 和 | | 运算符 =,[]和->运算符只能通过成员函数进行重载 << ...

  9. C++之运算符重载(前置++和后置++)

    今天在阅读<google c++ 编程风格>的文档的时候,5.10. 前置自增和自减:有一句话引起了我的注意: 对于迭代器和其他模板对象使用前缀形式 (++i) 的自增, 自减运算符.,理 ...

最新文章

  1. Notepad++写Verilog HDL代码时,在注释语句下出现红色波浪线怎么办?
  2. 用 for/in 在 Java 5.0 中增强循环
  3. Lesson 6.动态计算图与梯度下降入门
  4. real210移植记录-u-boot2013.10引导linux3.10.30进入控制台
  5. 创建Android Virtual Device
  6. MySql-第七篇单表查询
  7. oppor11点击Android,OPPO R11怎么网络共享?OPPO R11三种共享网络设置教程
  8. 2019年2月10日训练日记
  9. PCB会过期?过期后先烘烤?
  10. Python学习心得
  11. 计算机管理guest用户在哪,电脑来宾账户权限设置怎么设置
  12. 辞旧迎新:祝您阖家幸福安康,万事如意
  13. c语言编程if,关于C语言中#if的用法
  14. c++2013无法卸载_ADS软件安装卸载注意事项及问题解决办法
  15. base64编码和解码的js工具函数
  16. 计算机安装过程突然断电怎么办,电脑突然断电怎么办 电脑突然断电问题解决方法...
  17. python机器学习算法(赵志勇)学习笔记(基础部分)
  18. ant编译错误:不再支持源选项 1.5,请使用 1.6 或更高版本。
  19. 百度API之路线规划
  20. 加餐3 | 考博和读博

热门文章

  1. 一种高效的可变行高列表行定位算法
  2. Android开源项目分类汇总[转]
  3. 有种软件你不得不备着,那就是数据恢复类软件
  4. Object-C 有私有变量?私有方法?
  5. python数据分析报告的格式_Python数据报表之Excel操作模块用法分析
  6. 网站robots.txt探测工具Parsero
  7. 认识AndEngine选自Android 2D游戏引擎AndEngine快速入门教程
  8. ajax百分比加载特效,jQuery实现的简单百分比进度条效果示例
  9. python调用dll时路径问题_IDEA 使用 JNA 时,DLL 文件路径问题
  10. iOS 即时聊天键盘处理