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

Posted 一入机械深似海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于C++学习笔记——递增运算符的重载的主要内容,如果未能解决你的问题,请参考以下文章

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

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

C++基础-5-运算符重载(加号,左移,递增,赋值,关系,函数调用)

c++学习笔记:多态

C++学习笔记之高级语法

C++ Primer 0x0E 学习笔记