C++学习笔记——递增运算符的重载

  • 黑马C++课程学习笔记
#include<iostream>
#include<string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::ostream;
//重载递增运算符

//自定义整形类,以实现对该类的递增运算操作
class MyInteger
{
	friend ostream& operator<<(ostream& cout, MyInteger myint);//友元yyds!
public:
	MyInteger();

//1.重载++运算符(前置:++i返回+1后的值i+1)
	//这里注意:若返回类型不用引用&,而用值来返回,就无法实现链式递增,即++(++myint)输出为2,
	//之后再输出myint值为1(正常情况也应输出为2)
	//因为值传递的返回类型会返回一个新的拷贝对象,不是原来的myint对象了
	MyInteger& operator++()//写在成员函数里就不需要传参即可实现 ++myint
	{
		m_Num++;//先给自身的值+1
		return *this;//返回自身的值
	}

//2.重载++运算符(后置:i++ 返回i的值后再+1)
	/*无法重载只按返回类型区分的函数,这时候想要重载的话就需要在形参列表里加一个占位参数*/
	/*只写一个int代表占位参数,传入的值我们是拿不到的,
	因为这个形参没有变量只有数据类型。仅作区分用。*/
	//规定带占位参数的对应后置递增
	MyInteger operator++(int)
	//这里注意:返回类型不能用引用,
	/*因为返回的是局部变量temp,函数执行结束后局部变量会被释放,
	这时若使用引用,相当于第二次调用的时候引用了一个已经释放的变量,会出错。*/
	//总结:不能返回局部引用!!!
	/*这就是为什么后置递增比前置递增更耗时,
	因为后置递增使用的是值传递,前置递增使用的是引用传递*/
	{
		//先创建一个局部变量暂存此时结果
		MyInteger temp = *this;
		//后执行递增
		m_Num++;
		//最后只返回暂存的递增前的结果
		return temp;
	}

private:
	int m_Num;
};

MyInteger::MyInteger()
{
	m_Num = 0;
}

/*注意:这里第二个形参传入的值不使用引用传递,是因为后置递增的返回类型不能是引用,
故这里也得跟着一起改*/
ostream& operator<<(ostream& cout,MyInteger myint)
//本质是operator<<(cout, p),简化形式 cout << p
{
	cout << myint.m_Num;
	return cout;
}

void test01()
{
	MyInteger myint;

	cout << ++(++myint) << endl;//输出结果2
	cout << myint << endl;//输出结果2
}

void test02()
{
	MyInteger myint;

	cout << myint++ << endl;/*后置递增不能实现链式递增,因为是用值传递返回的。
	其实C++中原有的后置递增也不能实现链式,道理跟这个一样。*/
	cout << myint << endl;
}

int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一入机械深似海

小手一抖

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值