[C.C++] C++:重载++与--操作符

121 0
Honkers 6 天前 来自手机 | 显示全部楼层 |阅读模式


C与C++中 ++ 与 - - 的区别

  • 在C语言中,前置和后置++,- -都不能作为左值

  • 在C++中,前置的++和- -可以作为左值,(从下面的重载运算符中也可以看出,它们返回的是引用)

  • C++类似的提升还有三目运算符?:,在c中也不可以做左值,但c++中可以。

重载++、- -操作符原理:

自增运算符++、自减运算符- -都可以被重载,但是它们有前置、后置之分。 但是不论a++还是++a,都等价于a.operator++()无法体现出差别。

为了解决这个问题,C++ 规定,在重载++或- -时,允许写一个增加了无用 int 类型形参的版本

编译器处理++或- -前置的表达式时,调用参数个数正常的重载函数;处理后置表达式时,调用多出一个参数的重载函数。

图解++操作符,前置与后置的区别

代码示例:
  1. #include <iostream>
  2. using namespace std;
  3. class Test{
  4. int m_a;
  5. public:
  6. Test(int a = 0) :
  7. m_a(a)
  8. {
  9. }
  10. //前置++
  11. Test& operator ++ ()
  12. {
  13. m_a++;
  14. return *this;
  15. }
  16. //后置++(Test 后不跟 & 是因为返回值不能被赋值)
  17. Test operator ++ (int)
  18. {
  19. Test tmp = *this;
  20. m_a++;
  21. return tmp;
  22. }
  23. //前置--
  24. Test& operator -- ()
  25. {
  26. m_a--;
  27. return *this;
  28. }
  29. //后置--
  30. Test operator -- (int)
  31. {
  32. Test tmp = *this;
  33. m_a--;
  34. return tmp;
  35. }
  36. friend ostream & operator << (ostream & os, Test & t);
  37. };
  38. ostream & operator << (ostream & os, Test & t)
  39. {
  40. os << t.m_a;
  41. return os;
  42. }
  43. int testop()
  44. {
  45. Test t(7);
  46. // 隐式调用
  47. cout << t++ << endl; // 7
  48. cout << t << endl; // 8
  49. cout << --t << endl; // 7
  50. cout << t << endl; // 7
  51. // 显示调用(调用后置版本,经测试,不用0也行,只要可以转换成int的任意数。)
  52. cout << t.operator++(0) << endl; // 7
  53. cout << t << endl; // 8
  54. return 0;
  55. }
复制代码
要点总结:
  1. 对比前置++和后置++运算符的重载可以发现,后置++运算符的执行效率比前置的低。因为后置方式的重载函数中要多生成一个局部对象 tmp,而对象的生成会引发构造函数调用,需要耗费时间。同理,后置- -运算符的执行效率也比前置的低。
  2. 前置++运算符的返回值类型是 Test&,而后置++运算符的返回值类型是 Test,这是因为运算符重载最好保持原运算符的用法。C++ 固有的前置++运算符的返回值本来就是操作数的引用,而后置++运算符的返回值则是操作数值修改前的复制品。
  3. 在前的重载不需要参数,在后的重载需要一个象征性的 int 参数。

知识点习题

  1. 在重载一个运算符为成员函数时,其参数表中没有任何参数,这说明该运算符是 ( )。

A. 无操作数的运算符
B. 二元运算符
C. 前缀一元运算符
D. 后缀一元运算符

正确答案: C


如有不同见解,欢迎留言讨论!!!

本帖子中包含更多资源

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

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

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行