关于C++运算符重载的一个问题

我重载了<<来输出Person类
ostream& operator<<(ostream &out, Person &p)
{
out << p.name << ", age = " << p.age << endl;
return out;
}
然后Person类里面重载++运算
Person& Person::operator++()
{
++age;
return *this;
}
Person Person::operator++(int)
{
Person tmp = *this;
age++;
return tmp;
}

在输出的时候
Person p;
cout << p <<endl; 可以
cout << ++p <<endl; 可以
cout << p++ << endl; 这行就报错了
Person p1 = p++;
cout << p1 << endl; 这样也可以

报错那行是为什么呢。。重载的++不是返回的Person么,为什么不能输出

Person tmp = *this;
这是局部变量,只能返回引用,不能直接返回,否则放在堆栈内,返回不了。

只从这部分代码看不出问题。首先栈上的对象是可以返回的,因为存在中间变量。就像
int add(int x,int y)
{
int z = x+y;
return z;
}
这个函数一样。楼上说局部变量只能返回引用是不正确的。相反如果方法或函数要返回局部变量,则应该返回对象,而不是指向对象的引用,因为在被调用函数执行完毕时,局部对象将调用其析构函数。 栈对象是不可以返回引用的,除非,函数的调用者返回自身对象。

看你代码中有个p.name,这个name变量应该是个char *类型,你是不是动态申请了内存。如果是这样你就需要深拷贝。