C++ 中左值和右值引用的讲解

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;

void test01()
{
    //引用和指针的区别
    //1. 引用必须初始化,定义指针可以不初始化,但这样可能会造成野指针或者空指针
    //2. 引用值只有一级引用,没有多级引用;但指针除了有一级指针外,还有多级指针
    //3. 定义一个引用变量和定义一个指针变量,其底层的汇编指令是一样的;通过引用变量修改所引用的内存的值和通过指针的解引用修改变量的值得汇编指令也是一样的

    //int &a = 20; 代码错误, 20是一个不能取地址的值
    //左值是可寻址的变量,有持久性;
    //右值一般是不可寻址的常量,或在表达式求值过程中创建的无名临时对象,短暂性的。

    //什么是左值和右值
    //理解1:左值是有地址的,变量就是左值;右值没有地址,如数字1,它就是右值
    //理解2:左值能出现在赋值语句左边与右边;右值只能出现在赋值语句右边,如函数返回值只能在赋值语句右边


    //对于数组的引用:引用实际上相当于给数组arr起了一个别名,所以它的本质还是数组arr
    int arr[5] = { };
    int* p01 = arr;        //这里p01就是数组名,就是数组的首地址
    //int(*p01)[5] = &arr;    //数组指针
    int(&q01)[5] = arr;

    cout << sizeof(arr) << endl;
    cout << sizeof(p01) << endl;
    cout << sizeof(q01) << endl;
}

void test02(int(&arr)[3]) 
{
    //c++的数组类型是带有长度信息的,引用传递时如果指明是数组则必须指定长度
    cout << arr[0] << " " << arr[1] << " " << arr[2] << endl;
}

void test03()
{
    //左值引用
    int a = 10;
    int& b = a;        //左值,有内存,有名字,值可以修改,不需要生成临时变量;

    //右值引用
    //int& c = 20;    //错误,20是一个右值,没有地址,没有名字

    int&& c = 20;    //C++11以后的语法,此时c = 20;
    //相当于这样:
    //int temp = 20;    先定义一个临时变量
    //int c = temp;        在将临时变量的值给c

    c = 30;
    int& e = c;        //左值引用
    cout << c << " " << e << endl;
}

int main()
{
    test01();
    int arr[3] = { 0, 1, 2 };
    test02(arr);
    test03();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值