You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数返回的自定义对象是lvalue还是rvalue?C++代码示例解析

C++成员函数返回对象与返回引用的差异解析

问题场景

给定如下C++类定义:

#include<iostream>
using namespace std;

class Test{
private:
    int x;  
    int y;
public:
    Test (int x = 0, int y = 0) { this->x = x; this->y = y; }
    Test setX(int a) { 
        x = a; 
        return *this; 
    }
    Test setY(int b) { 
        y = b; 
        return *this;
    }
    void print() { 
        cout << "x = " << x << " y = " << y << endl; 
     }
};

执行以下代码后,输出为 x = 10 y = 0:

Test obj1;
obj1.setX(10).setY(24);    
obj1.print();

疑问点:

  1. obj1.setX(10)返回的对象是左值还是右值?
  2. 若将成员函数改为返回引用(如下代码),输出变为x = 10 y = 24,如何解释这种差异?
Test& setX(int a) { 
    x = a; 
    return *this; 
}
Test& setY(int b) { 
    y = b; 
    return *this;
}

解答

1. 返回对象的左/右值属性

obj1.setX(10)返回的是右值(C11及以后属于纯右值prvalue)。
C
规则里,只要函数返回的是非引用类型的对象(不管是原生类型还是自定义类),返回的都是临时对象,属于右值。这和原生类型函数(比如int func(){return 1;})返回右值的逻辑完全一致。

2. 返回值与返回引用的输出差异

  • 返回值类型时:
    obj1.setX(10)会创建一个obj1的副本作为返回值,后续调用setY(24)是在这个临时副本上修改y的值,原对象obj1的y完全没被改动。所以最后obj1.print()输出的是原对象的y=0。
  • 返回引用类型时:
    obj1.setX(10)返回的是原对象obj1的引用(*this的引用),后续调用setY(24)直接在原对象obj1上修改y的值,因此最终输出的是修改后的x=10,y=24,符合预期。

内容的提问来源于stack exchange,提问作者Alexius Tatius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 23:20:40