【C++ 运算符重载】1单目运算符++的重载(++t和t++的区别)

单目运算符++的重载:++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;//返回的是自增前的对象的临时状态
}

从而就实现了 返回的是最初的状态,但实际上已经自增了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值