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++学习笔记——递增运算符的重载的主要内容,如果未能解决你的问题,请参考以下文章