左值、右值 、左值引用、右值引用的總結

文章目錄

  • 什么是左值
  • 什么是右值
    • 純右值:
    • 將亡值:
  • 左值引用
  • 右值引用

在C語言中我們常常會提起左值(lvalue) 和 右值(rvalue) 這樣的稱呼。編譯器在編譯程序報錯時, 有時也會報出錯誤信息中會包含左值、右值的說法。但是左值和右值并沒有一個嚴謹的定義。大多數時候左右值的定義與其判別方法是一體的。
一個典型的的判別方法就是,在賦值表達式中。出現在等號左邊的就是 左值,而在等號右邊的,則稱為 右值
例如:
a = b + c;
在這個賦值表達式中,a就是一個左值,而b+c則是一個右值。這種識別左值、右值的方法在C++中依然有效。
不過C++中還有一個被廣泛認同的說法,那就是 可以取地址的、有名字的就是左值,反之 , 不能取地址的、沒有名字的就是右值
在這個賦值表達式中,&a是運行的操作。但是&(b+c) 這樣的操作則不會通過編譯。因此 a 是一個左值, (b+c) 是一個右值。

什么是左值

可以和按照C++上的說法:可以取地址的、有名字的就是左值。

什么是右值

不能取地址的、沒有名字的就是右值。具體在C++11中,右值是由兩個概念構成的。
一個是將亡值。一個是純右值。

純右值:

純右值(prvalue, Pure Rvalue)就是C++98標準中的右值概念,比如函數返回的臨時變量值。還有一些運算表達式,比如 1 + 3 產生的臨時變量值。
不跟對象關聯的字面量值,比如:2、‘c’ 、true。lambda表達式 。都是純右值。

將亡值:

將亡值 (xvalue, eXpiring) 是C++11中新增的跟右值引用相關的表達式。這樣的表達式通常是將要被移動的對象(移為他用)。
比如:返回右值引用 T&& 的函數返回值;std::move的返回值; 轉換為T&&的類型轉換函數的返回值。

:在C++11的程序中,所有的值必屬于左值、將亡值、純右值三者之一。

左值引用

左值引用就是C++98中的引用 T&。在沒出來C+11的右值引用之前。說的引用都是指的左值引用。
例如:
int a = 10;
int & b = a;
const int & c = a;
b和c都是 左值引用。b是非常量左值引用。c是常量左值引用。
左值引用顧名思義就是對一個左值進行引用的類型。也就是等號右側的是一個左值(可取地址的)。
而常量左值引用類型 比較特殊,也可以對右值進行引用。如 const int &d = 2; 但是 int &d = 2;是編譯不過的。
因此常量左值引用類型也稱為萬能的引用類型。通過常量左值引用不可以修改所引用的內容。而 非常量左值引用可以修改引用的內容。

右值引用

右值引用是C++11中新增的一種引用類型,顧名思義就是對一個右值進行引用的類型。事實上,由于右值不具有名字。我們也只能通過引用的方式找到的它的存在。
例如:T && a = ReturnRvalue();
這個表達式中,假設ReturnRvalue函數返回一個右值,我們就聲明了一個名為a的右值引用,其值等于ReturnRvalue函數返回的臨時變量的值。
注意: T&& 就是 右值引用的類型。與左值引用比較多了個 &符號。和二級指針的使用方式 不一樣。C++上不存在二級引用。
注意:引用 也是一個變量,不過是一種特殊的變量,擁有自己的類型。
相同點
左值引用和右值引用都是屬于引用類型。
無論聲明的一個左值引用還是右值引用,都必須立即進行初始化。而其原因可以理解為是引用類型本身自己并不擁有所綁定的對象的內
存,只是該對象的一個別名,幾乎不占用什么內存。
不同點
左值引用是具名變量值的別名,而右值引用則是不具名(匿名)變量的別名。
右值引用是不能夠綁定到任何的左值的。比如:
int c;
int && d = c;//編譯不過
相對的左值引用也是不可以綁定到右值(由右值進行初始化)的。
比如:
T & e = ReturnRvalue();//編譯不過。
但是存在例外:const T & e = ReturnRvalue();//編譯通過。上面我們說常量左值引用是萬能引用類型,它可以接收非常量左值(如:int
c),常量左值(如:const int c)、右值對其進行初始化。
右值引用類型的使用場景:用于移動構造函數的形參類型 和 移動語義緊密相關聯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208099.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208099.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208099.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Numpy數組的重塑,轉置與切片 (第6講)

Numpy數組的重塑,轉置與切片 (第6講) ??????? ??博主 侯小啾 感謝您的支持與信賴。?? ?????????????????????????????????????????????????????????????????????????????????…

String 和 StringBuffer和 StringBuilder 場景應用

目錄 1.三者區分2.String 不可變性的示例代碼:3.String 頻繁創建對象4.StringBuffer 是可變的,可以進行增刪改操作而不產生新的對象。5.StringBuffer 是線程安全的,適合在多線程環境下使用,但同步會帶來一定的性能損耗。 代碼舉例…

聚類分析 | Matlab實現基于譜聚類(Spectral Cluster)的數據聚類可視化

聚類分析 | Matlab實現基于譜聚類(Spectral Cluster)的數據聚類可視化 目錄 聚類分析 | Matlab實現基于譜聚類(Spectral Cluster)的數據聚類可視化效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 1.Matlab實現基于譜聚類(Spectral Cluster)的聚類算法可視化(完…

融云 Global IM UIKit

GlobalIM UIKit 基于多年領先的行業經驗,我們為開發者提供功能完備的單群聊 通信能力。“分鐘級”接入,即可得到符合海外用戶使用習慣的多端同步產品。 核心功能包括:快速接入、功能齊全、全球化交互體驗、內容審核、靈活可配置、高度自定義、…

c++詳解棧

一.什么是棧 堆棧又名棧(stack),它是一種運算受限的數據結構(線性表),只不過他和數組不同,數組我們可以想象成一個裝巧克力的盒子,你想拿一塊巧克力,不需要改變其他巧克…

基于AWS Serverless的Glue服務進行ETL(提取、轉換和加載)數據分析(二)——數據清洗、轉換

2 數據清洗、轉換 此實驗使用S3作為數據源 ETL: E extract 輸入 T transform 轉換 L load 輸出 大綱 2 數據清洗、轉換2.1 架構圖2.2 數據清洗2.3 編輯腳本2.3.1 連接數據源(s3)2.3.2. 數據結構轉換2.3.2 數據結構拆分…

FFmpeg開發筆記(六)如何訪問Github下載FFmpeg源碼

學習FFmpeg的時候,經常要到GitHub下載各種開源代碼,比如FFmpeg的源碼頁面位于https://github.com/FFmpeg/FFmpeg。然而國內訪問GitHub很不穩定,經常打不開該網站,比如在命令行執行下面的ping命令。 ping github.com 上面的ping結…

初識Linux:權限(1)

目錄 提示:以下指令均在Xshell 7 中進行 Linux 的權限 內核: 查看操作系統版本 查看cpu信息 查看內存信息 外部程序: 用戶: 普通用戶變為超級用戶: su 和 su-的區別: root用戶變成普通用戶&#…

KALI LINUX信息收集

預計更新 第一章 入門 1.1 什么是Kali Linux? 1.2 安裝Kali Linux 1.3 Kali Linux桌面環境介紹 1.4 基本命令和工具 第二章 信息收集 1.1 網絡掃描 1.2 端口掃描 1.3 漏洞掃描 1.4 社交工程學 第三章 攻擊和滲透測試 1.1 密碼破解 1.2 暴力破解 1.3 漏洞利用 1.4 …

什么是SSL證書?

當我們網上購物或銀行業務時,為了安全起見,我們希望看到網站的地址欄上有“HTTPS”和安全鎖圖標。但是這個“HTTPS”和鎖定圖標實際上意味著什么?要回答這些問題,我們需要了解 HTTPS、SSL 協議和 SSL 證書。 關于HTTPS、SSL和SSL…

風控反欺詐安全學習路標

1. 金融和支付領域知識 - 了解金融和支付領域的基本概念、業務流程和風險特點。 - 學習金融機構的監管要求和合規措施,如KYC(了解你的客戶)和AML(反洗錢)。 2. 數據分析和挖掘技術 - 學習數據分析和數據挖掘的基本原理…

fastadmin獲取關聯表數據select渲染

php public function piliangadd(){if (false === $this->request->isPost()) {$fenlei_list = Db::name(fenlei)->order(weigh desc)->select();$this</

每天五分鐘計算機視覺:稠密連接網絡(DenseNet)

本文重點 在前面的課程中我們學習了殘差網絡ResNet,而DenseNet可以看成是ResNet的后續,我們看一下圖就可以看出二者的主要區別了。 特點 DenseNet是一種卷積神經網絡,它的特點是每一層都直接連接到所有后續層。這意味著,每一層都接收來自前一層的輸出,并將其作為輸入傳遞…

Flyway——Oracle創建前綴索引

文章目錄 前言創建一般索引的語法前綴索引 前言 索引有助于提升數據庫表的查詢速率&#xff0c;極大的縮減查詢的時間。但索引的創建需要考慮的因素很多&#xff0c;并非索引越多越好&#xff01; 創建一般索引的語法 oracle創建一般的常見索引&#xff0c;語法如下所示&…

n個人排成一圈,數數123離隊

#include<stdio.h> int main() { int i, n100,k0,j0,a[1000]{0};//k&#xff1a;數數123的變量&#xff0c;j記錄離開隊列人數的變量scanf("%d",&n);for(int ii0; ii<n; ii){ for( i0; i<n; i){// printf("wei%d ",i);if((a[i]0)&&…

掌握Line多開技術,打造私人專屬空間

掌握Line多開技術&#xff0c;打造私人專屬空間 在現代社交網絡的時代&#xff0c;人們經常需要同時處理多個社交賬號&#xff0c;例如工作、家庭、朋友等不同領域的社交關系。而對于Line這樣的主流社交應用來說&#xff0c;多開技術可以讓用戶更便捷地管理多個賬號&#xff0…

數據結構線性表-棧和隊列的實現

1. 棧(Stack) 1.1 概念 棧&#xff1a;一種特殊的線性表&#xff0c;其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧 頂&#xff0c;另一端稱為棧底。棧中的數據元素遵守后進先出LIFO&#xff08;Last In First Out&#xff09;的原則。 …

Vue學習計劃-Vue2--Vue核心(三)methods和computed

Vue 1. 事件 v-on 基礎 使用 v-on:xxx或者xxx綁定事件&#xff0c;其中xxx是事件名 事件的回調需要配置在methods對象中&#xff0c;最終會在vm上 methods中配置函數&#xff0c;不要用箭頭函數&#xff0c;否則this就不是vm了 methods中配置函數&#xff0c;都是被Vue管…

Seata使用

本文以seata-server-1.5.2&#xff0c;以配置中心、注冊中心使用Nacos&#xff0c;store.modedb&#xff08;mysql&#xff09;為例進行操作。 一、Seata Server端 1、下載seata server 鏈接: http://seata.io/zh-cn/blog/download.html下載壓縮包&#xff0c;解壓至非中文目錄…

Java技術棧 —— 微服務框架Spring Cloud —— Ruoyi-Cloud 學習(一)

Ruoyi-cloud 項目學習 一、項目環境搭建與啟動1.1 nacos安裝部署1.1.1 nacos安裝、啟動1.1.2 nacos部署 1.2 seata安裝部署1.3 后端部署與運行1.3.1 ruoyi-modules-file模塊運行報錯 1.4 nginx安裝、部署、配置與啟動1.5 redis安裝與部署1.6 前段框架知識1.7 項目啟動1.8 參考 …