C++左值/右值

简单的结论:

左值:在内存中占有地址。
右值:在内存中没占用地址。

简单的例子

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    // value就是一个左值,10就是一个右值
    int value = 10;
    // value + 10是一个右值
    value + 10 = 10;
    // 10是一个右值
    10 = value;
}

在没有引用或指针的情况下,函数的返回值是一个右值。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int global_val = 100;
int get_value()
{
    return global_val;
}
int main()
{
    int value = get_value();
    // 错误get_value()是一个右值,不占有地址
    get_value() = 100; 
}

含有引用或指针的话,函数的返回值为左值。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int global_val = 100;
int* get_value()
{
    return &global_val;
}
int& get_value2()
{
    return global_val;
}
int main()
{
    int* value = get_value();
    // 正确,get_value()的返回值为指针,可以进行赋值
    *get_value() = 1000; 
    cout<<global_val<<endl;
    // 正确,get_value2()的返回值为引用,可以进行赋值
    get_value2() = 2000;
}

C++函数返回左值的功能十分常用,比如[]运算符的重载,返回值就是一个左值,可以进行赋值。

#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
int main()
{
    map<int,int> mnn_con;
    mnn_con[0] = 10;
}

左值、右值间的相互转换

左值可以转为右值,右值不能转为左值

#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
int main()
{
    int a = 10;
    int b = 10;
    int c = a + b; 
}

a,b为左值,但在 c = a + b时,a,b变为了右值。

&运算符

&接收一个左值,将左值变为右值

#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
int main()
{
    int a = 10;
    // a是一个左值,&a变为一个右值
    int* b = &a;
}

非const左值引用不能被赋右值。

#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
int main()
{
    // 错误,非const修饰的引用不能被赋右值
    int& a = 10;
    // 正确,const左值引用可以被赋右值
    const int& b = 20;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值