网上有不少解释都不太合理,这里把自己认为合理的解释记录下来。
代码
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
class Person {
// 这里在Person &p前加上const,是因为p++之后返回一个const修饰的右值,如果不加const会报错
// 还有的做法是不加const但把Person& p中的&去掉,也可行,但不少人的解释是有问题的
// 这里核心不是后置++代码中返回值为引用的问题,而是前面所说的p++之后会返回一个const修饰的右值,
// 所以我们也需要用const来接收,否则会报错。
friend ostream& operator<<(ostream& cout, const Person& p);
public:
Person(string name, int age) {
this->name = name;
this->age = age;
}
Person operator++(int) { // 后置++
Person temp = *this;
age++;
return temp;
}
private:
string name;
int age;
};
ostream& operator<<(ostream& cout, const Person& p) {
cout << p.name << " " << p.age;
return cout;
}
int main() {
Person p("hehe", 10);
cout << p++ << endl;
cout << p << endl;
return 0;
}
网上有一种回答是这样的:在重载左移运算符时,把ostream& operator<<(ostream& cout, Person& p)中的&符号去掉,原因给的是“后置递增返回的是temp的值”,这显然没有理解清楚,按常理来说,即便返回的是值,不是引用,难道就会报错?这样的说法显然站不住脚。
合理解释已在代码中给出,原因是“因为p++之后返回一个const修饰的右值”,所以我们需要在Person& p用const修饰,否则会出错!
文章讨论了在C++编程中,为何在重载`ostream&operator<<(ostream&cout,constPerson&p)`时需要使用`const`关键字。作者指出,正确理解是由于后置递增操作如`p++`返回的是一个`const`修饰的右值,因此在友元函数中接收参数时需要使用`const`以避免编译错误。文章通过一个示例代码解释了这个问题。
426





