运算符重载 ( ++的重载实例)

我们这里选择重点讲解前置/后置自增的重载
前置/后置自减就是一个道理啦

前置自增 ++num

前置自增:先自增再取值

重载前置自增允许有两种形式

成员函数:
num.operator++()
Data &operator++();

全局函数:
operator++(num)
Data &operator++(Data &);

需要提醒大家的是,在重载前置自增的时候,返回的是引用
我们在哪里还建议大家重载结束后返回引用?
没错,就是对<<>>的重载:

ostream &operator<<(ostream &,const Data &);
istream &operator>>(istream &,Data &);

之所以选择返回引用,很大的一个原因是为了之后能够级联使用该运算符:

cin>>x>>y;
cout<<u<<v;
++(++num);

当然,函数也好,重载运算符也好,选择返回引用还是返回值,主要的依据还是函数的功能和程序的需求
在这里不得不啰嗦一句,有些函数返回的是有const修饰的引用,这个时候就要格外注意:该函数返回的对象不能作为表达式的左值
更详细的const和&介绍可以去之前的blog里考古~
文章结尾介绍const和&的基本含义
实例讲解助力实战
可见const和&的运用,一直以来都是编程中的一个难点


后置自增 num++

后置自增:先取值再自增

重载前置自增允许有两种形式

成员函数:
num.operator++(integer)
const Data operator++(int);

全局函数:
operator++(num,integer)
const Data operator++(Data &,int);

可以看到,对于后置自增的重载,函数的参数有所增加,也没有选择返回引用,返回值还有const关键字修饰
这就说明后置自增返回的只是一个临时对象(拷贝值)

临时对象
临时对象是无法用肉眼观察到的,用完就析构。
① 类型转换:void f(Two) {cout << "Function f called." << endl;} f(one); //Two的临时对象
② 无名临时对象:Integer t = Interger(10);
③ 函数返回对象:cout<<String(5,15);

随之而来一个问题:

num++只能作为表达式的右值(我们不能对后置自增返回的值进一步操作)
++num既可以作为表达式的左值也可以作为表达式的右值

(a++)++;    //CE
++(a++);    //CE
a++ = 1;    //CE

(++a)++;    //OK
++(++a);    //OK
++a = 1;    //OK

重载测试

#include<iostream>
using namespace std;

class Test{
	friend ostream &operator<<(ostream &output,const Test &A) {
		output<<A.value;
		return output;
	}
public:
	Test():value(0) {};
	Test &operator++() {
		value++;
		return (*this);
	}
	const Test operator++(int) {
		Test tmp=(*this);
		++(*this);
		return tmp;
	}
private:
	int value;
};

int main() {
	Test num;
	cout<<num++<<endl;
	cout<<++num<<endl;
	system("pause");
	return 0;
}
//Output
0
2
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值