[C++基础]C++右值和左值

测试类A:

私有成员两个int型变量,三个构造函数:默认构造,带参构造,复制构造。

 1 class A{
 2 private:
 3     int val1;
 4     int val2;
 5 public:
 6     A(){
 7         cout<<"constructor call"<<endl;
 8     }
 9     A(int a,int b):val1(a),val2(b){
10         cout<<"constructor(2 para) call"<<endl;
11     }
12     A(const A &a){
13         this->val1=a.val1;
14         this->val2=a.val2;
15         cout<<"copy constructor call"<<endl;
16     }
17 
18     int getVal1() const {
19         return val1;
20     }
21 
22     int getVal2() const {
23         return val2;
24     }
25 };

其他函数:

第1行:右值引用版本的getAR。
第7行:普通引用版本的getAL。
line14&15:a对象接收了初始化列表{1,-1}产生的右值,而a是左值,因而调用getA的普通版本。
line16:初始化列表{1,-1}产生右值,调用getA的右值引用版本。
getA()中返回的是一个{},也是一个右值,但return后的值都被左值接收了。
line17可以通过编译而line18会报错,原因就是return {}的是一个右值,必须调用getAR(右值引用版本)。

 1 A getAR(A&& para){
 2     cout<<"receive para(rvalue):"<<para.getVal1()<<", "<<para.getVal2()<< endl;
 3     return {2,-2};
 4 }
 5 
 6 
 7 A getAL(A& para){
 8     cout<<"receive para(lvalue):"<<para.getVal1()<<", "<<para.getVal2()<< endl;
 9     return {2,-2};
10 }
11 
12 
13 int main(){
14     A a {1,-1};
15     auto r1 = getAL(a);
16     auto r2 = getAR({2,-2});
17     getAR(getAL(a));
18 //    getAL(getAL(a));
19 }

 

posted @ 2022-10-10 21:15  vitamin8bit  阅读(4)  评论(0)    收藏  举报