C++ 左值和右值 的學習

  • 引用是一個變量,它引用其他變量的內存位置
int x = 34;
int &lRef = x;
  • 標識符 IRef 就是一個引用。在聲明中,引用是通過 & 來指示的,出現在類型與變量的標識符之間,這種類型的引用稱為左值引用
  • 左值看作是一個關聯了名稱的內存位置,允許程序的其他部分來訪問它,?"名稱" 解釋為任何可用于訪問內存位置的表達式
  • 右值則是一個臨時值,它不能被程序的其他部分訪問
int square(int a)
{return a * a;
}
int main()
{int x = 0; // 1x = 12; // 2cout << x << endl; // 3x = square(5); // 4cout << x << endl; // 5return 0;
}
  • x 是一個左值,這是因為 x 代表一個內存位置,它可以被程序的其他部分訪問,例如上面注釋的第 2、3、4 和 5 行
  • 表達式 square(5) 卻是一個右值,因為它代表了一個由編譯器創建的臨時內存位置,以保存由函數返回的值。該內存位置僅被訪問一次,也就是在第 4 行賦值語句的右側。在此之后,它就會立即被刪除,再也不能被訪問了。對于包含右值的內存位置來說,其本質就是:它雖然沒有名稱,但是可以從程序的其他部分訪問到它
  • C++11 引入了右值引用的概念,以表示一個本應沒有名稱的臨時對象。右值引用的聲明與左值引用類似,但是它使用的是 2 個?&?符號(&&)
int && rRef = square(5);
cout << rRef << endl;
  • 聲明一個右值引用,給一個臨時內存位置分配一個名稱,這使得程序的其他部分訪問該內存位置成為了可能,并且可以將這個臨時位置變成一個左值。
  • 右值引用不能約束到左值上,所以,以下代碼將無法編譯:
int x = 0;
int && rRefX = x;
  • 初始化完成之后,這個包含值 square(5) 的內存位置有了一個名稱,即 rRef1,所以 rRef1 本身變成了一個左值。這意味著后面的這個初始化語句將不會編譯:int && rRef2 = rRef1;究其原因,就是右側的 rRef1 不再是一個右值。綜上所述,臨時對象最多可以有一個左值引用指向它。如果函數有一個臨時對象的左值引用,則可以確認,程序的其他部分都不能訪問相同的對象
int && rRef1 = square(5);
  • 右值一般是不可尋址的常量,或在表達式求值過程中創建的無名臨時對象,短暫性的。
  • 左值是可尋址的變量,有持久性;
  • 左值和右值主要的區別之一是左值可以被修改,而右值不能。
  • 左值引用:引用一個對象;
  • 右值引用:就是必須綁定到右值的引用,C++11中右值引用可以實現“移動語義”,通過 && 獲得右值引用。
  • 右值引用和相關的移動語義是C++11標準中引入的最強大的特性之一,通過std::move()可以避免無謂的復制,提高程序性能。

特殊情況

  • 但const左值引用除外,由于const的不可變性,所以const引用可以指向右值,我們經常使用const引用作為函數參數傳遞? ? const int &e = a*3; // 正確:左值引用,const引用可以綁定到一個右值上

例子

int x = 6; // x是左值,6是右值
int &y = x; // 左值引用,y引用xint &z1 = x * 6; // 錯誤,x*6是一個右值
const int &z2 =  x * 6; // 正確,可以將一個const引用綁定到一個右值int &&z3 = x * 6; // 正確,右值引用
int &&z4 = x; // 錯誤,x是一個左值

參考鏈接

  • C++左值和右值(詳解版)
  • 一篇文章弄懂C++左值引用和右值引用 - html中文網

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

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

相關文章

百度關鍵詞排名查詢源碼_章丘百度霸屏總部,關鍵詞排名騰沃云

上海保沃騰沃云為您詳細解讀URiIr章丘百度霸屏總部的相關知識與詳情&#xff0c;做網站SEO優化文章內容優化效果已經十分明顯。內容的量量關于網站的整體量量很重要。通過關鍵字闡發&#xff0c;陳某們曉得需要環繞關鍵字編寫網頁。使您的內容的重要根底是您對網頁籌算描述的賣…

java 結婚問題

題目 大家都知道&#xff0c;男大當婚&#xff0c;女大當嫁。那么女方家長要嫁女兒&#xff0c;當然要提出 一定的條件&#xff1a;高&#xff1a;180cm以上&#xff1b;富&#xff1a;財富1千萬以上&#xff1b;帥&#xff1a;是。 如果這三個條件同時滿足&#xff0c;則&…

密碼學專題 數據填充的方式|序列加密的方式

電子密碼本模式和加密分組鏈接模式的分組算法都要求加密輸入的分組是固定長度 的&#xff0c;但是大多數輸入明文可能都不是分組長度的整數倍&#xff0c;也就是說&#xff0c;最后一個分組一般來 說是不足一個分組長度的。為了使分組加密算法能夠正常工作&#xff0c;通常使用…

win10此電腦不見了_教程 | win10總提示“你要允許此應用對電腦的修改嗎”,如何關閉?...

在使用電腦的時候&#xff0c;你是否曾遇到過這樣的情況&#xff0c;點擊打開軟件的時候&#xff0c;系統總是提示我們“你要允許此應用對你的設備進行修改嗎&#xff1f;”難道是軟件中病毒了嗎&#xff1f;&#xff0c;這其實上并沒有什么用處&#xff0c;只是系統無法判斷軟…

java 小時轉換為xx天xx小時

題目 為抵抗洪水&#xff0c;戰士連續作戰89小時&#xff0c;編程計算共多少天零多少小時&#xff1f; 代碼 使用/與% class ExchangeTime {public static void main(String[] args) {/*為抵抗洪水&#xff0c;戰士連續作戰89小時&#xff0c;編程計算共多少天零多少小時&a…

密碼學專題 加密模式的選擇|傳輸數據加密

分組加密模式和序列加密模式。它們之間最大的區 別在于分組加密模式每次對一組數據進行加密運算處理&#xff0c;而序列加密模式則逐位對數據進 行加密運算處理。事實上&#xff0c;在實際設計應用的算法中&#xff0c;并沒有那么嚴格的區別&#xff0c;它們有可能是相互結合的…

微信公眾號數據2019_2019年9月原創公眾號排行榜數據報告出爐

西瓜數據發布 2019 年 9 月原創公眾號排行榜&#xff0c;分別從西瓜指數、原創文章占比、周期內公眾號發文次數、發文篇數、總閱讀數、頭條平均閱讀數等方面展示公眾號數據。榜單說明1、涉及榜單本期月榜截取 ①財經、②教育、③娛樂、④科技、⑤體育、⑥游戲、⑦文化、⑧美食、…

java 求100天之后是周幾

題目 今天是周二&#xff0c;100天以后是周幾&#xff1f; 代碼 代碼1&#xff1a;減去天數&#xff0c;使循環從周一開始 //方法1&#xff1a;減去天數&#xff0c;使循環從周一開始int today2;//7天一個循環&#xff1a;3 4 5 6 7 1 2 3 4 5 6 7int after100;//(100-5)%…

密碼學專題 OpenSSL專題

OpenSSL總體架構 軟件包分為三個主要的功能部分&#xff1a;密碼算法庫 、 SSL協議庫及應用程序 MacOS&#xff0c;MS&#xff0c;OS/2及 VMS這幾個目錄&#xff0c;包含了在不同的 平臺編譯時的環境變量配置文件&#xff0c;在安裝編譯完成之后&#xff0c;這幾個目錄就沒有作…

java 華氏溫度轉換為攝氏溫度

題目 小明要到美國旅游&#xff0c;可是那里的溫度是以華氏度為單位記錄的。 它需要一個程序將華氏溫度&#xff08;80度&#xff09;轉換為攝氏度&#xff0c;并以華氏度和攝氏度為單位分別顯示該溫度。 公式&#xff1a;華氏溫度&#xff08;攝氏溫度-32&#xff09;/1.8 M…

hs控什么意思_凡爾賽文學 到底是什么?

點擊藍字關注我們XIE XIE NI DE XI HUAN|| 動漫 情頭 耽美 閨蜜 男女頭 句子控 壁紙 ||左句 凡爾賽文學野象&#xff1a;老是有人提知不知道凡爾賽文學&#xff0c;說實話我不太清楚網絡時下流行的梗&#xff0c;也沒有興趣參與&#xff0c;我還是比較喜歡歐洲古典文學和后現…

密碼學專題 openssl編譯和安裝

Configure 腳本文件 使得OpenSSL可以適應多種不同的系統平臺和多達幾十種不同的編譯器。Configure指令還可以使OpenSSL在編譯的時候具備組件的選擇功能&#xff0c;比如可以選擇支持或者不支持某種算法或者協議等&#xff0c;這使得OpenSSL具有很大的靈活性&#xff0c;比如在…

Python學習12 文件的讀寫

目標 文件的打開和關閉 mode缺省情況下表示只讀r 文件的路徑 前面加個r’,代表其中的轉義字符不起作用 文件的打開方式 案例&#xff1a;實現文件拷貝的功能 將某一文件夾下的某一文件 保存在當前文件 所在目錄。 import os #讀取文件1 path./file.txt fileopen(path,…

密碼學專題 openssl的基本概念

配置文件 配置文件是OpenSSL的一個基礎結構組件&#xff0c;OpenSSL使用一組稱為OpenSSLCONF的函數來讀取OpenSSL配置文件的信息。OpenSSL提供的主配置文件是opensl.cnf&#xff0c;它集成了OpenSSL所要使用的配置文件選項的大部分內容。此外&#xff0c;OpenSSL還提供了其他一…

該工程中的宏被禁止_建筑勞務分包都能承擔什么工程

來源&#xff1a;找法網建筑工程的承包單位&#xff0c;也就是總承包單位可以將部分建造工程分包給具有資質的施工單位&#xff0c;這是法律所允許的&#xff0c;但是禁止將建造工程進行轉包。一、建筑勞務分包都能承擔什么工程建筑勞務分包能承擔什么工程要看分包單位的資質&a…

python實驗練習-類的多繼承

題目 1、概述&#xff1a; 完成學生&#xff0c;組長&#xff0c;教師的設計與實現。 2、具體實現內容&#xff1a; 學生&#xff1a; 姓名&#xff0c; 年齡&#xff0c; 學號 吃飯&#xff0c; 睡覺&#xff0c; 學習 組長&#xff1a; 姓名&#xff0c; 年齡&#xff0c; 學…

matlab用辛普森公式求積分_積分近似計算之辛普森公式

對于積分區間[a, b]&#xff0c;若則成立辛普森公式辛普森公式可看作是改良的梯形公式。梯形公式是以直線逼近實際曲線&#xff0c;而辛普森公式則以二次曲線(即拋物線)逼近。以二次曲線逼近實際曲線根據辛普森公式可得各積分小區間內的積分值如下式所示&#xff1a;其中于是&a…

密碼學專題 文件編碼格式

OpenSSL中雖然使用PEM作為基本的文件編碼格式&#xff0c;但是&#xff0c;由于不同的對象其封裝的標準格式不太一樣&#xff0c;所以經常會導致讀者產生迷惑。此外&#xff0c;OpenSSL也支持DER編碼和過時的Netscape編碼格式(NET)OpenSSL的編碼是基于ASN.1標準的&#xff0c;A…

python實驗練習-圖書管理系統(使用文件來實現)

題目 功能描述&#xff1a; 圖書管理系統項目功能描述&#xff1a; &#xff08;1&#xff09;創建txt文本文檔&#xff0c;包含如下&#xff1a; ① books.txt&#xff1a;保存有一些書籍名稱&#xff1b; ② users.txt&#xff1a;用于保存用戶相關的信息&#xff1b; ③ us…

echarts 折線圖 設置y軸最小刻度_【硬貨】vue全家桶+Echarts+百度地圖,搭建數據可視化系統...

作者丨夙言來源丨前端大牛愛好者(Web-2017)https://segmentfault.com/a/1190000018993981本文章篇幅略長&#xff0c;內容有點多&#xff0c;大佬可根據目錄選擇性查閱&#xff0c;新人可一步步來閱讀。1、 前言1.1 業務場景突然接到產品說要做一個數據監控的系統。有線圖、柱狀…