c++后置递增运算符重载为什么不能传引用

文章讨论了在C++编程中,为何在重载`ostream&operator<<(ostream&cout,constPerson&p)`时需要使用`const`关键字。作者指出,正确理解是由于后置递增操作如`p++`返回的是一个`const`修饰的右值,因此在友元函数中接收参数时需要使用`const`以避免编译错误。文章通过一个示例代码解释了这个问题。

网上有不少解释都不太合理,这里把自己认为合理的解释记录下来。

代码

#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修饰,否则会出错!

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值