【5minC++基本功】——左值与右值|左值引用与右值引用

【5minC++基本功】——左值与右值|左值引用与右值引用

  • 1. 为什么要学习左值与右值?
  • 2.左值和右值的概念
    • 2.1 什么是左值?
      • 2.1.1 常见的左值
    • 2.3 什么是右值?
      • 2.3.1 常见的纯右值
      • 2.2.2 什么是将亡值
      • 2.2.3 产生将亡值的情形

1. 为什么要学习左值与右值?

C++当中的值语义:
GC(Garbage Collection, 垃圾回收)语言之中, 大部分变量都是引用语义, 内存管理交给GC. 通过值语义, 能够方便直观地控制对象的生命周期,让RAII(Resource Acquisition Is Initialization, 即通过构造和析构函数来获取和释放资源,管理变量的生命周期)用起来更自然.

C++ 11中引入了右值引用的概念, 实现移动语义完美转发, 提高程序的性能和效率. 这也成为C++相关岗位面试中的一大热点, 因此很有必要掌握左值与右值的概念, 以及左值引用和右值引用的相关知识.

2.左值和右值的概念

2.1 什么是左值?

—— 简单地说, 它是指向内存位置的表达式,其值可以被修改, 它的特点是:

    • 可以出在等号左边;
    • 能够取地址
    • 具有别名

2.1.1 常见的左值

  1. 变量名
int x = 5;        
  1. 返回左值引用的函数调
// 返回变量 x 的引用
int& getX() {return x;
}
  1. 前置自增自减
int y = ++x; // 预增操作,x 先自增再赋值给 y, 这里的++x返回的就是一个左值
++x = 10; // ++x, 自增操作返回一个左值,可以用10对其赋值
  1. 赋值运算或复合赋值运算
++x = 10; // 自增操作返回左值,可以赋值
std::cout << "x: " << x << std::endl; // 输出 10++x += 3; // 自增操作返回左值,可以进行复合赋值std::cout << "x: " << x << std::endl; // 输出 9
  1. 解引用
++*ptr = 10; // 自增指针解引用返回左值,可以赋值

2.3 什么是右值?

    • 不能被赋值的表达式,通常是临时值或字面常量
  • 右值分为纯右值与将亡值

2.3.1 常见的纯右值

  1. 字面值——字面值有整型、浮点数、字符、字符串、布尔型、空指针等, 其中除了字符串型的字面值以外, 其他均为右值.
int a=8; //这里的8就是一个字面值double b = 3.14;  // 3.14 是右值char c = 'A';  // 'A' 是右值bool d = true;  // true 是右值int* ptr = nullptr;  // nullptr 是右值const char* str = "Hello";  // "Hello" 是一个指向常量字符数组的左值
  1. 非引用类型的函数调用
int add(int a, int b) {return a + b;
}// 不能对右值进行赋值
// add(x, y) = 20; // 错误
  1. 后置自增自减
    int a = 5;int b = a++; // a++ 返回右值,b 的值是 5,a 的值变为 6std::cout << "a: " << a << ", b: " << b << std::endl; // 输出 a: 6, b: 5// 不能对右值进行赋值// a++ = 10; // 错误
  1. 算术表达式
    int a = 10, b = 20;int c = a + b; // a + b 返回右值std::cout << "c: " << c << std::endl; // 输出 30// 不能对右值进行赋值// (a + b) = 50; // 错误
  1. 逻辑表达式
    bool x = true, y = false;bool z = x && y; // x && y 返回右值std::cout << "z: " << z << std::endl; // 输出 0 (false)// 不能对右值进行赋值// (x && y) = true; // 错误
  1. 比较表达式
    int a = 5, b = 10;bool result = a < b; // a < b 返回右值, 因为a<b是不能被赋值的// (a < b) = false; //这种写法错误

2.2.2 什么是将亡值

它表示资源即将被移动或者销毁的对象

2.2.3 产生将亡值的情形

  1. std::move 函数的返回值——因为这个函数调用移动赋值运算符而不是拷贝赋值运算符。例如下例:
#include <iostream>
#include <utility> // std::move
#include <string>class MyClass {
public:MyClass() : data(new int[100]) {std::cout << "Default constructor" << std::endl;}~MyClass() {delete[] data;std::cout << "Destructor" << std::endl;}// 移动构造函数MyClass(MyClass&& other) noexcept : data(other.data) {other.data = nullptr;std::cout << "Move constructor" << std::endl;}// 移动赋值运算符MyClass& operator=(MyClass&& other) noexcept {if (this != &other) {delete[] data;data = other.data;other.data = nullptr;std::cout << "Move assignment operator" << std::endl;}return *this;}private:int* data;
};int main() {//...省略部分obj1的定义MyClass obj2;obj2 = std::move(obj1); // 这里触发了移动赋值运算符return 0;
}
  1. 临时对象(尤其是那些通过std::move显式转换的临时对象), 例如:
MyClass createObject() {MyClass obj;return obj; // 返回值优化 (RVO) 会避免多次拷贝,这里的 obj 是一个将亡值
}3. 返回右值引用的函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/25486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R语言统计分析——数据集概念和数据结构

参考资料&#xff1a;R语言实战.第2版 1、数据集的概念 数据集通常是由数据构成的一个矩形数组&#xff0c;行表示观测&#xff0c;列表示变量。 不同行业对于数据集的行和列叫法不同。统计学称为观测&#xff08;observation&#xff09;和变量&#xff08;variable&#xff…

动态规划(多重背包+完全背包)

P2851 [USACO06DEC] 最少的硬币 G 题解&#xff1a;从题目上看到那个有n种不同的货币&#xff0c;对于买家来说每个货币有C[ i ]个&#xff0c;是有限个数的&#xff0c;但是对于卖家来说 每个货币都是无限的&#xff0c;题目中要我们求的是买到这个物品的最小交易的货币数&…

[Vue-常见错误]浏览器显示Uncaught runtime errors

文章目录 错误描述正确写法具体如下 错误描述 当前端代码发生错误时&#xff0c;浏览器中出现以下错误提示。 正确写法 显然这不是我们所期望的&#xff0c;在vue.config.js中配置如下设置关闭Uncaught runtime errors显示 devServer: {client: {overlay: false}具体如下 …

Nvidia的成功与竞争:CEO黄仁勋的自信与挑战

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

计算机操作系统基础知识:操作系统体系结构图,操作系统的内核,大内核与微内核的区别和优缺点,时钟管理,原语

1.操作系统体系结构图&#xff1a; 2.操作系统的内核&#xff1a; 时钟管理&#xff1a;利用时钟中断实现计时功能。 原语&#xff1a;原语是一种特殊的程序&#xff0c;具有原子性。也就是说&#xff0c;这段程序运行必须一气呵成&#xff0c;不能被中断。 ubuntu、centos的…

[Llama3] ReAct Prompt 测试实验

ReAct 是一种 LLM 提示和结果处理方法&#xff0c;结合了推理、行动计划和知识源整合&#xff0c;使 LLM 超越其语言模型&#xff0c;并在预测中使用来自现实世界的信息。 ReAct 是推理和行动的结合。 介绍 ReAct 的论文表明它比思维链提示更好。与后者不同的是&#xff0c;Re…

quick4 - hackmyvm

简介 靶机名称&#xff1a;quick4 难度&#xff1a;简单 靶场地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmQuick4 本地环境 虚拟机&#xff1a;vitual box 靶场IP&#xff08;quick4&#xff09;&#xff1a;192.168.56.104 跳板机IP(windows 11)&…

使用Spring Boot设计对象存储系统

对象存储系统是一种以对象为存储单位的存储架构&#xff0c;适合存储大量非结构化数据&#xff0c;如图片、音视频文件、文档等。MinIO是一个高性能的对象存储系统&#xff0c;基于开源和云原生的设计理念。本文将讨论如何使用Spring Boot设计一个类似MinIO的对象存储系统。 目…

Day17—JavaScript与Ajax请求分析

Ajax(Asynchronous JavaScript and XML)是一种在不重新加载整个页面的情况下,能够与服务器交换数据并更新部分网页的技术。随着Web应用的广泛使用,Ajax请求已成为动态网页数据加载的常见方式。在爬虫中处理JavaScript动态加载的数据,需要对Ajax请求有深入的理解。 1. Aja…

推荐三款你不知道的良心软件

Tico——抠图、拼图软件 抠图软件大家见过很多了把&#xff0c;但是从多张图片中抠出来的图片拼接成一张图片你们很少见过吧。 Tico就是一款将抠出来的图片拼接成一张新图片的软件&#xff0c;目前仅支持IOS平台。 Tico拼贴图提供了强大的图像编辑和处理功能&#xff0c;用户…

论文降痕指南:如何有效降低AIGC率

随着 AI 技术迅猛发展&#xff0c;各种AI辅助论文写作的工具层出不穷&#xff01; 为了防止有人利用AI工具进行论文代写&#xff0c;在最新的学位法中已经明确规定“已经获得学位者&#xff0c;在获得该学位过程中如有人工智能代写等学术不端行为&#xff0c;经学位评定委员会…

连续状态方程的离散化例子

连续状态方程的离散化 在控制系统中,连续状态方程的离散化是一个重要的步骤,用于将连续时间系统转换为离散时间系统,以便在数字控制器中实现。这通常涉及将连续时间的微分方程转换为离散时间的差分方程。常用的离散化方法 前向欧拉法(Forward Euler)简单易实现,但精度较…

MoreTable 方法selectWithFun,count 使用实例

ORM Bee, example for MoreTable methods:selectWithFun,count ORM Bee时, MoreTable 方法selectWithFun,count 使用实例 package org.teasoft.exam.bee.osql;import org.teasoft.bee.osql.BeeException; import org.teasoft.bee.osql.FunctionType; import org.teasoft.be…

ssm615基于ssm的房源管理系统+vue【已测试】

前言&#xff1a;&#x1f469;‍&#x1f4bb; 计算机行业的同仁们&#xff0c;大家好&#xff01;作为专注于Java领域多年的开发者&#xff0c;我非常理解实践案例的重要性。以下是一些我认为有助于提升你们技能的资源&#xff1a; &#x1f469;‍&#x1f4bb; SpringBoot…

312. 戳气球 Hard

有 n 个气球&#xff0c;编号为0 到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球&#xff0c;你可以获得 nums[i - 1] * nums[i] * nums[i 1] 枚硬币。 这里的 i - 1 和 i 1 代表和 i 相邻…

python脚本将视频抽帧为图像数据集

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

程序猿大战Python——pycharm软件的使用

基础配置 目标&#xff1a;了解PyCharm软件的基础配置处理。 修改背景颜色&#xff1a; Appearance -> Theme 修改字体大小&#xff1a; 搜索font -> Font 例如&#xff0c;一起完成背景、字体大小的修改。 总结&#xff1a; &#xff08;1&#xff09;如果要对PyChar…

专业场景化ChatGPT论文润色提示词指令,更精准、更有效辅助学术论文撰写

大家好&#xff0c;感谢关注。我是七哥&#xff0c;一个在高校里不务正业&#xff0c;折腾学术科研AI实操的学术人。可以添加我&#xff08;yida985&#xff09;交流学术写作或ChatGPT等AI领域相关问题&#xff0c;多多交流&#xff0c;相互成就&#xff0c;共同进步。 在学术写…

【ai】Audio2Face简介

Audio2Face 简介 FACEGOODAudio2Face是英伟达Omniverse平台的一部分,它使用先进的AI技术来生成基于音频输入的逼真面部动画。这个技术主要利用深度学习模型来解析人声,进而驱动一个三维模型的面部表情。下面是Audio2Face工作流程的详细说明: 预备阶段 在使用Audio2Face之前,…

Java基础 - Stream流操作

Stream将要处理的元素集合看作一种流&#xff0c;在流的过程中&#xff0c;借助Stream API对流中的元素进行操作&#xff0c;比如&#xff1a;筛选、排序、聚合等。 Stream流操作 遍历/匹配&#xff08;foreach、find、match&#xff09; List<Integer> list Arrays.…