c++课本p312有关于单目运算符++重载的示例
以前++为例
其代码
- Time Time::operator++(){
- if(++sec>=60){
- sec-=60;
- ++minute;
- }
- return *this;
- }
//看到之后非常不解,此程序明明只需要将本对象中的private数据minute和second改掉就好了,就如同我的版本
- void Time::operator++(){
- if(second==59){
- second=0;
- if(minute==59)minute=0;
- else minute++;
- }
- else second++;
- }
//看了一些帖子之后终于弄明白了
//在c++ Primer中有如下经验
//为了与内置类型数据匹配,前缀式操作符应该返回被增量或者被减量的【引用】;后缀式操作符应返回旧值(不是引用,就是一个相同的类,且其值是改变之前的)
//于是我写了两个测试程序来验证返回引用和返回值的的区别
- #include<iostream>
- using namespace std;
- class Num{
- public:
- Num(int n=0):num(n){}
- void display();
- Num operator++();
- private:
- int num;
- };
- Num Num::operator++(){
- num+=2;
- return *this;
- }
- void Num::display(){
- cout<<num<<endl;
- }
- int main(){
- Num num;
- ++num;
- num.display();
- ++(++num);
- num.display();
- return 0;}//此为返回值的类型,其运行结果为:
- 2
- 4
- //由此可见,第一次操作(20行)修改了对象num的值
- //而第22行仅是内层的++操作有效,而外层的++所应用的对象并不是num本身,而是一份它的拷贝,故仅对num有一次有效的+2操作,在之前的基础上变成了4//下面是引用的版本
返回引用:
- #include<iostream>
- using namespace std;
- class Num{
- public:
- Num(int n=0):num(n){}
- void display();
- Num& operator++();
- private:
- int num;
- };
- Num& Num::operator++(){
- num+=2;
- return *this;
- }
- void Num::display(){
- cout<<num<<endl;
- }
-
- int main(){
- Num num;
- ++num;
- num.display();
- ++(++num);
- num.display();
- return 0;
- }
- //此时两次操作都是对num
- //输出结果:
- 2
- 6
小结一下:
关于运算符重载的返回值类型问题
1.如果希望运算符被重载后不带回任何值,此时不许要返回类型,写void(如本程序,本人的如下代码完全可以达到题目要求)
- #include<iostream>
- #include<windows.h>
- using namespace std;
- class Time{
- public:
- Time(int m=0,int s=0):minute(m),second(s){}
- //Time operator++();//本身是返回一个time类,但是并没有修改当前的类的自己的值,也就是对自己的time类本身没有操作
- void operator++();
- void display();
- private:
- int minute;
- int second;
- };
- void Time::display(){
- cout<<minute<<":"<<second<<endl;
- }
- void Time::operator++(){
- if(second==59){
- second=0;
- if(minute!=59)minute++;
- else minute=0;
- }
- else second++;
- }
- int main(){
- Time t1;
- t1.display();
- for(int i=0;i<100;i++){
- Sleep(1000);
- ++t1;
- t1.display();
- }
- return 0;
- }
- //第7行就是开始对书上例题程序的疑问,觉得这个返回值在程序中没有被使用,是多此一举
2.如果希望运算符被重载后还能带回返回值,及表达式在被操作后有值,使用返回一个类,写法为1.返回类型写类名 2.重载部分结尾加上return *this;
3.如果希望能够连续运算,如上面对num的前++持续操作有效,此时应返回引用,写法为1.返回值类型写类名& 2.重载部分结尾加上return *this;