运算符重载时多个对象相加的问题

问题遇到的现象和发生背景

两个对象相加没有问题,多个对象相加会报错

问题相关代码,请勿粘贴截图
// 全局函数重载+
Person operator+(Person& q, Person& p)
{
    Person temp;
    temp.height = q.height + p.height;
    temp.weight = q.weight + p.weight;
    return temp;
}

int main()
{
    Person p1(10, 10);    
    Person p2(20, 20);    
    Person p3(30, 30);    
    Person p4(40, 40);    
    Person p5(50, 50);    

    cout << (p1 + p2 + p3 + p4 + p5).height << endl;    
    cout << (p1 + p2 + p3 + p4 + p5).weight << endl;

运行结果及报错内容

img

我的解答思路和尝试过的方法

返回引用输出错误

img

我想要达到的结果

+运算符重载,返回值不用引用的时候是正确的,用引用反而是错误的。
用引用的时候,返回的变量是在重载运算符函数中声明的临时变量的引用,但是这个变量出了函数后,就被系统回收了。所以返回得到的就是一个被回收了的变量,这个变量的值是不确定的。所以,结果就是错误的。

下面是不用引用的时候的VS2008运行结果:

img

下面是用引用的时候的运行结果:

img

Person s1 = p1 + p2;
Person s2 = p3 + p4;
Person s3 = s1 + s2;
Person s4 = s3 + p5;
std::cout << s4.height() << s4.weight() << std::endl;
这样写吧,貌似不允许多个对象相加...

如果不行,那就是不允许相同类的相加操作了,我以前玩的时候都是搞不同类之间的操作的,同一个类没试过...
如果你只是想获得相加后的数据,直接拿对象.height相加就好了

img

你可以重新看一下重载的定义,重载加号只需要一个参数,另一个参数是自己

参数是引用类型,返回值不是引用类型,你就不能连续加。把返回值改为引用类型试试

你这两个参数的时候调用的也不对呀,根本不是p1+p2这样调用的啊

参数改成const T&
T 就是你的类