C++系列-递增运算符重载


山中 - 王维
荆溪白石出,天寒红叶稀。
山路元无雨,空翠湿人衣。


  • 自增运算符 ++ 会把操作数加 1。
  • 自增运算符 ++可以放在操作数的前面(前缀)或后面(后缀)。
  • 使用前缀形式(++在操作数的前面),则会在表达式计算之完成自增或自减。
  • 使用后缀形式(++在操作数的后面),则会在表达式计算之完成自增或自减。

递增运算符重载总结

  • 前置自增运算符的重载函数,函数参数是空
  • 后置自增运算符的重载函数,多一个没用的参数int
  • 前置运算符返回对象的引用
  • 后置运算符返回普通对象

前置递增运算符重载

  • (++h1) 返回的是自增后 h1 对象,自增后的h1 对象在后续运算过程中,同样会被修改,所以前置运算符的重载函数的返回值必须是引用 &。
code:
	#include <iostream>
	using namespace std;
	class Horse
	{
		friend void test01();		// 方便测试打印结果
	private:
		int m_age = 3;
	public:
		Horse(int age)
		{
			m_age = age;
		}
		Horse& operator++()		// 必须要返回引用,因为这样才是对原对象的不断累加,才会实现原对象值夜随之改变
		{
			m_age ++;
			return *this;
		}
	};
	void test01()
	{
		Horse h1(0);
		cout << "age: " << h1.m_age << endl;
		cout << "age: " << (++(++(++h1))).m_age << endl;		// 使用的是自增后的结果
		cout << "age: " << h1.m_age << endl;
	}
	
	int main()
	{
		int a1 = 0;
		cout << ++(++a1) << endl;
		test01();
		system("pause");
		return 0;
	}
result:
	2
	age: 0
	age: 3
	age: 3

后置运算符重载

  • 后置运算符需要先返回当前值,然后再实现递增,所以要先返回,并且不能返回引用,否则返回的值就是改变后的值。
code:
	#include <iostream>
	using namespace std;
	class Horse
	{
		friend void test01();
		friend void test02();
	private:
		int m_age = 3;
	public:
		Horse(int age)
		{
			m_age = age;
		}
		Horse& operator++()		// 前置, 必须要返回引用, 因为这样才是对原对象的不断累加后的结果,在累加时才会实现原对象值也随之改变
		{
			m_age ++;			// 先自增
			return *this;		// 返回对象的引用
		}
		Horse operator++(int)		//后置, 必须要利用占位参数来区分为后置,这里先要将当前的对象属性记录下来,最后返回的是记录下来的值,因为后置++是先返回本身值,再进行+1操作
		{
			Horse result = *this;	// 记录++前的结果
			m_age++;
			return result;			// 不能返回局部变量的引用,result的结果是一个临时变量,调用完毕后就释放,如果返回引用会报错
		}
	};
	void test01()
	{
		Horse h1(0);
		cout << "age: " << ++(++(++h1)).m_age << endl;		//先对操作数进行累加,再返回,因为返回的是对象引用,一直是对同一个对象在操作
		cout << "age: " << h1.m_age << endl;
	}
	void test02()
	{
		Horse h1(0);
		cout << "age: " << h1.m_age << endl;
		cout << "age: " << h1++.m_age << endl;		// 后置++无法实现嵌套
		cout << "age: " << h1.m_age << endl;
	}
	
	int main()
	{
		int a1 = 0;
		cout << ++(++a1) << endl;
		test01();
	
		int b1 = 0;
		cout << b1++ << endl;
		cout << b1 << endl;
		//cout << (b1++)++ << endl;		//错误语句,后置的自增是无法嵌套的,因为返回值并非是对象本身
		test02();
		system("pause");
		return 0;
	}
result:
	2
	age: 3
	age: 3
	0
	1
	age: 0
	age: 0
	age: 1
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值