函数返回的自定义对象是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();
疑问点:
obj1.setX(10)返回的对象是左值还是右值?- 若将成员函数改为返回引用(如下代码),输出变为
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
相关产品推荐
相关产品推荐

