君义_noip 2022-01-24 11:38 采纳率: 100%
浏览 106
已结题

c++重载输出流运算符<<时,为什么不能输出表达式的值

重载输出流运算符<<时,为什么只能输出单个变量的值,而不能输出表达式的值?
原理是什么?

#include <bits/stdc++.h>
using namespace std;
#define N 1000
struct Point
{
    int x, y;
    Point(){}
    Point(int a, int b):x(a),y(b){}
    Point operator + (Point &b)
    {
        return Point(x+b.x, y+b.y);
    }
    friend ostream& operator << (ostream& os, Point &p)
    {
       os<<"("<<p.x<<','<<p.y<<")";
       return os;
    }
};
int main()
{
    Point p(1,2), q(3,4), r;
    cout << p << ' ' << q << endl;
    r = p + q;
    cout << r << endl;
    //以上编译都过了 能正常运行
    cout << (p+q); //这行写编译不过, 请问为什么?
    //报错:[Error] cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
    return 0;
}


  • 写回答

3条回答 默认 最新

  • 关注

    +运算返回的是一个临时变量,p+q返回的是一个临时变量,<<重载运算符中用引用的时候(也就是用Point &p的时候),是对这个临时变量的引用,但是这个临时变量在+运算符重载函数结束后就被回收了,所以,如果<<中用引用的时候,引用指向了一个被销毁的对象,所以会报错。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 君义_noip 2022-01-24 11:43
    关注

    把13行Point &p改为Point p,就能过了。
    请问原理是什么?p+q返回的到底是什么类型的东西?为什么传值可以,传引用就不行?

    评论
  • 有问必答小助手 2022-01-25 00:29
    关注
    您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
    PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月2日
  • 已采纳回答 1月25日
  • 创建了问题 1月24日

悬赏问题

  • ¥15 用vite创建的vue3项目,404重定向不起作用??
  • ¥15 关于#c语言#的问题:一个球从80米高度自由落下,每次落地后反弹的高度为原高度的一半计算6次小球反弹的高度.(反弹结果取整,使用走走for循环结构)
  • ¥15 SurfaceControl的screenshot问题
  • ¥15 基于51单片机的oled菜单代码,要C语言,模块化编程!
  • ¥15 JAVAswing,设计一个扑克牌什么的
  • ¥50 python ctypes调用dll实现分析
  • ¥40 用python解决数据统计问题
  • ¥100 是否有方案能通过抓包分析得到移动应用的名称和包名信息?
  • ¥15 opencv检测不到轮廓
  • ¥15 vuforia收费标准