单目运算符++的重载:++t和t++的区别
t++和++t的区别
自增运算符会因其与操作数的位置关系不同而有不同的运算逻辑。
#include<iostream.h>
int main()
{
int t=0;
cout<<"t++ :"<<t++<<endl;//-------(1)
cout<<"++t :"<<++t<<endl;//-------(2)
return 0;
}
运行的结果为:
分析:
首先需注意:两行cout语句中的自增都是针对 t 变量,所以两次自增后 t 肯定为2。
对于cout语句(1)中的cout<<t++; 等价于cout<<t;t=t+1;所以cout输出的结果为 0 ,(1)行语句结束后t=1。
对于cout语句(1)中的cout<<++t; 等价于t=t+1;cout<<t;所以cout输出的结果为 2 ,(1)行语句结束后t=2。
总结:
自增符号和操作数的位置关系决定了是先自增还是先对其进行其他操作。
不必强记,可根据格式来记忆:t++ 从左至右,先是 t,再是++,所以先对 t 执行其他操作再自增;++t 从左至右,先是++,再是 t,所以先自增,再对 t 执行其他操作。
单目运算符++的重载
eg:有一个时钟类,包含数据成员 hour、minute、second,模拟时钟,使用++让其每次走一秒,满60进1 。
需要注意的地方:
①实现在操作数为对象时,++仍有因位置不同而有不同运算逻辑的特点。
②实现了对输入输出流的重载,使能够直接输入和输出对象。
③注意在声明对象、输入初始时间、时间自增时时间格式的调整(即:满60进1)
#include<iostream.h>
#include<windows.h>
class Time
{
public:
Time(int h,int m,int s);
Time operator ++();//默认单目运算符在前(eg:++t)
Time operator ++(int);//形参为int用来标志单目运算符在后(eg:t++)
friend istream & operator >>(istream &,Time &);
friend ostream & operator <<(ostream &,const Time &);
friend void arrange(Time &);//整理时间格式
private:
int hour;
int minute;
int second;
};
Time::Time(int h,int m,int s):hour(h),minute(m),second(s)
{
arrange(*this);//调整声明对象时不规范的格式
}
Time Time::operator ++()
{
second++;
arrange(*this);//时间自增时时间格式的调整
return *this;
}
Time Time::operator ++(int)
{
Time temp(*this);
second++;
arrange(*this);//时间自增时时间格式的调整
return temp;
}
void arrange(Time &t)
{
while(t.second>=60)
{
t.minute++;
t.second-=60;
}
while(t.minute>=60)
{
t.hour++;
t.minute-=60;
}
if(t.hour>=24) t.hour=t.hour%24;
}
istream& operator >>(istream& input,Time &t)
{
input>>t.hour>>t.minute>>t.second;
arrange(t);//输入初始时间时格式调整
return input;
}
ostream& operator <<(ostream& output,const Time &t)
{
output<<t.hour<<":"<<t.minute<<":"<<t.second;
return output;
}
int main()
{
Time t0(0,0,0),t1(0,0,0);
cout<<"请输入两个初始时间:"<<endl;
cin>>t0>>t1;
cout<<"++ t0:"<<(++t0)<<endl;
cout<<"t1 ++:"<<(t1++)<<endl;
return 0;
}
运行结果:
分析:
着重分析如下代码,详细如何实现“++对象" 和 “对象++” 不同的运算逻辑的重载。
单目运算符重载时的一般格式为:
返回值的类型 operator 单目运算符()
{
}
经该一般模式定义后,使用单目运算符时默认运算符在前(eg:++t)。
Time Time::operator ++()
{
second++;
arrange(*this);//时间自增时时间格式的调整
return *this;
}
那该如何实现(t++)这种使用格式的重载呢?
①针对“++” 和“–”这一特点,C++约定:在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自增(自减)运算符函数。【声明时】
即: 返回值的类型 operator 单目运算符(int )
{
}
②函数的返回值应该是对象本身在自增前的一个复制,并要在函数体中实现对本身的自增操作。【定义时】
Time Time::operator ++(int)
{
Time temp(*this);//*this 就是此时对象本身,使用复制构造函数将其复制为temp对象
second++;//实现对本身的自增
arrange(*this);//时间自增时时间格式的调整
return temp;//返回的是自增前的对象的临时状态
}
从而就实现了 返回的是最初的状态,但实际上已经自增了。