1.在进行后置++引用时,直接使用Person temp = *this;不能使用引用操作,因此不能实现++(++a)的操作(结果是值只更新一次),因为两个++操作的对象变了。
换成使用static Person temp = *this;时,加入static 成为静态对象,放在全局区,因此可以返回引用,可以操作同一个数据,既可以实现(a++)++;
这也是为什么在c语言中,可以实现++(++a),但是不能实现(a++)++的原因吧。
2.引用的本质在c++内部实现是一个指针常量。
3.函数重载的条件:
1.在同一个作用域下
2.函数名称相同
3.函数参数类型不同或者个数不同或者顺序不同
注意:这里面并没有按照返回值不同来进行函数重载的,因此在进行后置++重载时,使用[返回类型] operator++(int) ;来告诉编译器这里是重载后置运算符。
#include "stdafx.h"
#include "iostream"
#include <string>
using namespace std;
//1.在进行后置++引用时,直接使用Person temp = *this;不能使用引用操作,因此不能实现++(++a)的操作,因为两个++操作的对象变了,使用static Person temp = *this;时,加入static 成为静态对象,放在全局区,因此可以返回引用,可以操作同一个数据,既可以实现(a++)++;
//2.引用的本质在c++内部实现是一个指针常量
class Person
{
friend ostream &operator<<(ostream &cout, Person &p);
public:
Person()
{
}
//前置++重载
Person& operator++()//使用引用,每次返回的还是原先操作的那个对象,可以实现类似 ++(++a)的操作。
{
m_a++;
return *this;
}
//后置++重载
Person& operator++(int)
{
//Person temp = *this;使用这个只能a++操作一次,且返回类型不能使用引用--Person&,
//因为这是一个临时对象,使用引用将返回一个已经被释放的内存区域
//即不能返回局部变量的引用
//Person temp = *this;
//加入static 成为静态对象,放在全局区,因此可以返回引用,可以操作同一个数据,既可以实现(a++)++;
static Person temp = *this;
//先++
m_a++;
//再返回原先的
return temp;
}
//前置--重载
Person& operator--()
{
m_a--;
return *this;
}
//后置--重载
Person& operator--(int)
{
//Person temp = *this;//使用这个只能a--操作一次,且返回类型不能使用引用--Person& ,因为这是一个临时对象,使用引用将返回一个已经被释放的内存区域
static Person temp = *this;//加入static 成为静态对象,放在全局区,因此可以返回引用,可以操作同一个数据,既可以实现(a--)--;
m_a--;
return temp;
}
Person(int a)
{
m_a = a;
}
private:
int m_a;
};
ostream &operator<<(ostream &cout, Person &p)
{
cout << p.m_a;
return cout;
}
void test()
{
Person p1(10);
cout << "m_a = " << p1++ << endl;
cout << "m_a = " << --p1 << endl;
}
int main()
{
test();
system("pause");
return 0;
}