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 = , int b = )
  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(, );
  55. t1.display();
  56. ++t1;
  57. t1.display();
  58. --t1;
  59. t1.display();
  60. Test t2(, );
  61. t2.display();
  62. t2++;
  63. t2.display();
  64. t2--;
  65. t2.display();
  66. cout << "hello world!\n";
  67. return ;
  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 = , int b = )
  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(, );
  53. t1.display();
  54. ++t1;
  55. t1.display();
  56. --t1;
  57. t1.display();
  58. Test t2(, );
  59. t2.display();
  60. t2++;
  61. t2.display();
  62. t2--;
  63. t2.display();
  64. cout << "hello world!\n";
  65. return ;
  66. }

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

c++重载后置++和--的更多相关文章

  1. C++:重载前置++/--返回引用,重载后置++/--返回临时对象

    标准库中iterator对++/--的重载代码如下: _Myiter& operator++() { // preincrement ++*(_Mybase *)this; return (* ...

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

    1,C 语言中讨论了原生含义,C++ 中有必要考虑前置.后置操作符能够重载,有何问题: 2,值得思考的问题: 1,下面的代码有没有区别?为什么? 1,i++  // i 的值作为返回值,i 自增 1: ...

  3. C++语法小记---前置操作符和后置操作符

    前置操作符和后置操作符 单独的"++i"和"i++"是否有区别 对于基本类型: 二者没有区别,因为编译器会对代码进行优化,二者的汇编代码完全相同 对于类类型: ...

  4. C++前置++与后置++的区别与重载

    ++属于单目运算符,前置与后置的实现代码不一样,下面以整数自增为例: // 前置++,返回自增后的值,且返回的是一个左值 int& operator++(){ *this += 1; retu ...

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

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

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

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

  7. 【M6】区别increment/decrement操作符的前置(prefix)和后置(postfix)形式

    1.考虑++(--的情况是一样的),前置是累加然后取出,后置是取出然后累加. 2.重载方法根据形参表的不同区分,问题来了,前置和后置形式都没有形参,因此没法区分.怎么办? 对于后置增加一个形参int, ...

  8. c++ 前置++与后置++的区别

    用C++编程的都知道,C++提供了一个非常强大的操作符重载机制,利用操作符重载,我们可以为我们自定义的类增加更多非常有用的功能.不过,C++也有限制,就是当我们为自定义的类重载操作符时,重载操作符的含 ...

  9. C++的前置++、后置++和前置--、后置--

    一.C++的前置++和后置++ 在C++中,运算符重载是你必须要掌握的重点,而前置++和后置++有什么区别呢?其实前置++和后置++是有关于 影响效率的问题,前置++比后置++的效率要高,原因是因为前 ...

随机推荐

  1. Theano Logistic Regression

    原理 逻辑回归的推理过程能够參考这篇文章:http://blog.csdn.net/zouxy09/article/details/20319673,当中包括了关于逻辑回归的推理,梯度下降以及pyth ...

  2. tarfile模块可以方操作tar归档文件

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #Python自带的tarfile模块可以方便读取tar归档文件 #http://www.open-open. ...

  3. HTTP 304状态分析

       在看http log日志发现很多304状态的标识 HTTP 304: Not Modified   ###请求后读取本地缓存的文件标准解释是:Not Modified 客户端有缓冲的文档并发出了 ...

  4. lua入门之二:c/c++ 调用lua及多个函数返回值的获取

    当 Lua 调用 C 函数的时候,使用和 C 调用 Lua 同样类型的栈来交互. C 函数从栈中获取她的參数.调用结束后将返回结果放到栈中.为了区分返回结果和栈中的其它的值,每一个 C 函数还会返回结 ...

  5. useradd或者userdel相关用户管理命令不好用

    前言 有时使用useradd或者userdel会出现如下报错: userdel: cannot open /etc/passwd 很明显是/etc/passwd文件导致的 一.查看以及改变文件状态 [ ...

  6. Microsoft Office2003打开office2007文件的补丁

    Microsoft  office2003打开office2007,不需要安装2007,只需要装一个补丁即可 搜索:office2003打开office2007文件的补丁

  7. MongoDB基本管理命令 [转]

    MongoDB基本管理命令 linux下配置安装mongodb 10分钟玩转mongoDB 官网安装教程 使用命令行方式连接mongodb: mongo /admin -u用户名 -p密码  --连接 ...

  8. JFinal record类型数据在前台获取

    1.jfinal record还得自己处理一下 可以使用 this.setSessionAttr("user", record.getColumns()); 这样在jsp中el表达 ...

  9. iOS开发 - 用AFNetworking实现https单向验证,双向验证

    https相关 自苹果宣布2017年1月1日开始强制使用https以来,htpps慢慢成为大家讨论的对象之一,不是说此前https没有出现,只是这一决策让得开发者始料未及,博主在15年的时候就做过ht ...

  10. Jmete ----r默认报告优化

    转自:http://www.cnblogs.com/puresoul/p/5053035.html 一.本文目的: 之前写了两篇文章搭建持续集成接口测试平台(Jenkins+Ant+Jmeter)和A ...