当前位置: 首页 > 工具软件 > loading bar > 使用案例 >

【C++】重载运算符号时的函数返回值类型问题

殳俊晤
2023-12-01

c++课本p312有关于单目运算符++重载的示例

以前++为例

其代码


  
  
  1. Time Time::operator++(){
  2. if(++sec>=60){
  3. sec-=60;
  4. ++minute;
  5. }
  6. return *this;
  7. }
//看到之后非常不解,此程序明明只需要将本对象中的private数据minute和second改掉就好了,就如同我的版本

  
  
  1. void Time::operator++(){
  2. if(second==59){
  3. second=0;
  4. if(minute==59)minute=0;
  5. else minute++;
  6. }
  7. else second++;
  8. }
//看了一些帖子之后终于弄明白了

//在c++ Primer中有如下经验

//为了与内置类型数据匹配,前缀式操作符应该返回被增量或者被减量的【引用】;后缀式操作符应返回旧值(不是引用,就是一个相同的类,且其值是改变之前的)

//于是我写了两个测试程序来验证返回引用和返回值的的区别


  
  
  1. #include<iostream>
  2. using namespace std;
  3. class Num{
  4. public:
  5. Num(int n=0):num(n){}
  6. void display();
  7. Num operator++();
  8. private:
  9. int num;
  10. };
  11. Num Num::operator++(){
  12. num+=2;
  13. return *this;
  14. }
  15. void Num::display(){
  16. cout<<num<<endl;
  17. }
  18. int main(){
  19. Num num;
  20. ++num;
  21. num.display();
  22. ++(++num);
  23. num.display();
  24. return 0;}//此为返回值的类型,其运行结果为:
  25. 2
  26. 4
  27. //由此可见,第一次操作(20行)修改了对象num的值
  28. //而第22行仅是内层的++操作有效,而外层的++所应用的对象并不是num本身,而是一份它的拷贝,故仅对num有一次有效的+2操作,在之前的基础上变成了4//下面是引用的版本
返回引用:


  
  
  1. #include<iostream>
  2. using namespace std;
  3. class Num{
  4. public:
  5. Num(int n=0):num(n){}
  6. void display();
  7. Num& operator++();
  8. private:
  9. int num;
  10. };
  11. Num& Num::operator++(){
  12. num+=2;
  13. return *this;
  14. }
  15. void Num::display(){
  16. cout<<num<<endl;
  17. }
  18. int main(){
  19. Num num;
  20. ++num;
  21. num.display();
  22. ++(++num);
  23. num.display();
  24. return 0;
  25. }
  26. //此时两次操作都是对num
  27. //输出结果:
  28. 2
  29. 6
小结一下:

关于运算符重载的返回值类型问题

1.如果希望运算符被重载后不带回任何值,此时不许要返回类型,写void(如本程序,本人的如下代码完全可以达到题目要求)


  
  
  1. #include<iostream>
  2. #include<windows.h>
  3. using namespace std;
  4. class Time{
  5. public:
  6. Time(int m=0,int s=0):minute(m),second(s){}
  7. //Time operator++();//本身是返回一个time类,但是并没有修改当前的类的自己的值,也就是对自己的time类本身没有操作
  8. void operator++();
  9. void display();
  10. private:
  11. int minute;
  12. int second;
  13. };
  14. void Time::display(){
  15. cout<<minute<<":"<<second<<endl;
  16. }
  17. void Time::operator++(){
  18. if(second==59){
  19. second=0;
  20. if(minute!=59)minute++;
  21. else minute=0;
  22. }
  23. else second++;
  24. }
  25. int main(){
  26. Time t1;
  27. t1.display();
  28. for(int i=0;i<100;i++){
  29. Sleep(1000);
  30. ++t1;
  31. t1.display();
  32. }
  33. return 0;
  34. }
  35. //第7行就是开始对书上例题程序的疑问,觉得这个返回值在程序中没有被使用,是多此一举

2.如果希望运算符被重载后还能带回返回值,及表达式在被操作后有值,使用返回一个类,写法为1.返回类型写类名 2.重载部分结尾加上return *this;

3.如果希望能够连续运算,如上面对num的前++持续操作有效,此时应返回引用,写法为1.返回值类型写类名& 2.重载部分结尾加上return *this;






 类似资料: