未及. 2022-03-12 20:50 采纳率: 50%
浏览 34

关于自增运算符重载 & 输出流运算符cout重载的问题

在学习c++运算符重载问题的时候,我学到了自增运算符重载。其中在后置++重载的时候up主说不能返回引用类型,只能返回类对象
——因为在函数中,先定义个局部变量存++之前的值,然后返回。但是不能返回局部变量的引用导致了必须返回一个类对象——这无可厚非。
但是在调用cout重载后的函数对后置++的类对象进行输出的时候,发现了问题,如下:

#include <iostream>
#include <string>

using namespace std;
class person {
    friend ostream& operator<<(ostream& cout,  person& p);
    //friend ostream& operator<<(ostream& cout, person p);
public:
    person(int a);
    person operator++(int);
private:
    int p_a;
};
person person::operator++(int)// int是占位参数,用以区分前置和后置递增的重载
                              // 不能返回引用,因为后置要返回运算前的值,必须定义一个临时变量并返回它的值,如果返回临时变量的引用会出现问题(见笔记)
{
    person p = *this;
    p_a++;
    return p;
}
person::person(int a) {
    p_a = a;
}
ostream& operator<<(ostream& cout,  person& p) {
//ostream& operator<<(ostream& cout, person p) {
    cout << p.p_a;
    return cout;
}
void test01() {
    person p1(2);

    cout << p1++ << endl;

    cout << p1 << endl;
}
int main()
{
    test01();
}

本来在输出前置++的时候好好地cout函数,在输出后置++的时候报出了错误,导致程序崩溃

img

但是在将函数修改为(第二个参数直接写为值传递)

ostream& operator<<(ostream& cout, person p) {
    cout << p.p_a;
    return cout;
}

或者(第二个参数引用前加了const)

ostream& operator<<(ostream& cout, const person& p) {

    cout << p.p_a;
    return cout;
}

的时候,程序正常运行

请问这是为什么?谢谢大家!

  • 写回答

2条回答 默认 最新

  • 真相重于对错 2022-03-12 21:25
    关注

    因为 p++ 返回 一个临时对象,一个引用类型无法绑定到临时对象,用const 引用可以绑定临时对象

    评论

报告相同问题?

问题事件

  • 创建了问题 3月12日

悬赏问题

  • ¥15 欧拉系统opt目录空间使用100%
  • ¥15 ul做导航栏格式不对怎么改?
  • ¥20 用户端如何上传图片到服务器和数据库里
  • ¥15 现在研究生在烦开题,看了一些文献,但不知道自己要做什么,求指导。
  • ¥30 vivado封装时总是显示缺少一个dcp文件
  • ¥100 pxe uefi启动 tinycore
  • ¥15 我pycharm运行jupyter时出现Jupyter server process exited with code 1,然后打开cmd显示如下
  • ¥15 可否使用carsim-simulink进行四轮独立转向汽车的联合仿真,实现四轮独立转向汽车原地旋转、斜向形式、横移等动作,如果可以的话在carsim中如何进行相应设置
  • ¥15 Caché 2016 在Java环境通过jdbc 执行sql报Parameter list mismatch错误,但是同样的sql使用连接工具可以查询出数据
  • ¥15 疾病的获得与年龄是否有关