IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++中的通俗理解左值,右值,左值引用,右值引用 -> 正文阅读

[C++知识库]C++中的通俗理解左值,右值,左值引用,右值引用

背景

在C++11中添加了几个概念:左值,右值,左值引用,右值引用。这几个概念非常抽象,只能尽力去解释和阐述。

左值

左值 = 内存 + 名字 + 地址
在这里插入图片描述

int a = 1 //a是左值,因为有名字a, 内存里面是1,地址是ox01
a = 2; //左值
printf("%d\n", a = 3);//利用了左值的右值属性

右值

左值 = 内存 + 地址
在这里插入图片描述

int a = 1 //1是右值,因为只有内存+地址,没有名字

左值引用

给有名字的内存额外起一个别名,需要用语法&
在这里插入图片描述

int a = 1;
int& b = a;

右值引用

给没名字的内存(右值)起一个名字,需要用语法&&

int&& a = 1;

在这里插入图片描述

可以发现,一旦给右值起了一个名字,就会发现右值变成了左值(名字+内存+地址),这个要好好理解。

const引用

在这里插入图片描述

const int& a = 3;

我们知道3是右值,而&是给一个有名字的内存(左值)取一个别名, 为了能给右值起别名,看清楚是起别名,不是起名字,因为起名字用&&就可以。这里可以通过const加一个限制,那么就可以给3起别名了,尽管3就一个名字。留一个问题,现在的a是左值还是右值?(答案是左值,因为满足了左值条件)

测试

既然我们已经学完1+1=2了,那么下面开始来解一元二次方程了!

demo_1

int& a = 3;

会编译报错,为什么?因为3是一个右值,而&是给左值起一个额外的名字,所以编译报错。

demo_2

int a = 4;
int &&b = a;

会编译报错,为什么?因为a是一个左值,而&&是给右值起第一个名字,你都有名字了还来用&&凑热闹,所以编译报错。

demo_3

int a = 4;
int &b = a * 2;

会编译报错,为什么?因为a是一个左值,a *2 这里是利用了a的右值属性,所以a *2 会生成一个没有名字的右值,你去给一个没有名字的内存块取别名是不行的,因为他都没有名字,何来别名一说?所以你只能用&&给他取一个名字

move语义

move的意思是把左值的名字移出掉(其实还是可以用a去调用),所以会变成右值,因此一个左值一旦用了move, 最好保证它在move后不要再被调用,毕竟move的思想就是把名字除去了,毕竟都被除名了,也就是想表达以后我不会再叫你a了。
在这里插入图片描述

#include <iostream>
using namespace std;

void Show(int&& para)
{
        cout<<para<<endl;
        para = 4;
}

int main()
{
        int a = 5;
        Show(3);//right
        Show(a);//error
        Show(move(a));//right
        cout<<a<<endl;//最好杜绝这样用法,可以看到a已经变成4了
        return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 00:33:07  更:2022-09-30 00:36:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 5:21:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码