<五>掌握左值引用和初識右值引用

来源:https://www.cnblogs.com/erichome/archive/2022/10/28/16837004.html
-Advertisement-
Play Games

1:C++的引用,引用和指針的區別? 1:從彙編指令角度上看,引用和指針沒有區別,引用也是通過地址指針的方式訪問指向的記憶體 int &b=a ; 是需要將a的記憶體地址取出並存下來, b=20;(通過引用修改值時,也是先取出指向的地址,然後訪問該地址的值並修改它,和通過指針修改值一樣) 在定義引用的時 ...


1:C++的引用,引用和指針的區別?
1:從彙編指令角度上看,引用和指針沒有區別,引用也是通過地址指針的方式訪問指向的記憶體
int &b=a ; 是需要將a的記憶體地址取出並存下來, b=20;(通過引用修改值時,也是先取出指向的地址,然後訪問該地址的值並修改它,和通過指針修改值一樣)
在定義引用的時候,必須初始化,並能夠對a取地址。所以 int &c=20 編譯錯誤的,因為20取不了地址.
2:引用只有一級引用沒有多級引用,指針有一級指針和多級指針
3:定義一個引用變數和定義一個指針變數,其彙編指令是一樣的.通過引用變數修改所引用記憶體的值和通過指針修改所指向記憶體的值其底層指令也是一樣的.
4:
int array[5]={};
int *p=array;
cout<<sizeof(array)<<endl; //20
cout<<sizeof(p)<<endl; //4


2:怎麼定義一個引用變數
第1步:先對要引用的變數 取地址即&, &a ,然後定義一個指針來接, 所以就變成了 int *p=&a;
第2步: 用&符號取代 * ,所以變成了 int &p=a;

那麼又怎麼定義一個引用變數來引用一個數組呢?
第1步: 對數組名取地址 &array, 對數組取地址要怎麼接能? int (*p)[5]=&array;
第2步:用& 取代 *, 所以就變成了 int (&p)[5]=array;
如果列印 sizeof(p) ,值也是20,就是數組的大小.


3:引用有什麼好處?
void swap(int a, int b){
int c=a;
a=b;
b=c;
}
上面的代碼是實現不了值交換的,需改為如下方式
void swap(int *a ,int b){
int c =
a;
a =b;
*b=c;
}
另外一種方式,通過引用
void swap(int &a,int &b){
int c=a;
a=b;
b=c;
}
上面通過引用的方式整體在使用上更簡潔更自然.其實引用的方式在底層指令實現上,仍然是通過傳遞地址,
只是編譯器幫我們在後臺做了很多轉換的工作.


4:關於左值引用和右值引用
左值: 它有記憶體,有名字,值可以修改
例如 int a=10;
就可以定義引用 int &b=a;

但是 int &c=20;//不可以 20內有記憶體,無法取值,20 是右值
右值:沒有記憶體,沒名字

C++11 以後,提供了右值引用 如下
int &&m=20;
也還可以 m =30;
上面代碼底層彙編的實現方式,其實是將20存儲在棧記憶體中的一個臨時量上,然後把臨時量的記憶體地址給 m

int &&m=20;//通過右值引用來引用右值

那麼
int a=10;
int &b =a;

int &&c=20
左值引用和右值引用在彙編指令上的實現是怎麼樣的?

一個右值引用變數本事是一個左值,這個右值引用本身也是有名字,也占存儲空間,也是可以取地址的,而且只能用左值引用變數來引用它,如下,
int &&m=20;
int &n=m;

不能用一個右值引用變數來引用一個左值,如下
int c=100;
int &&m=c;
上面編譯報錯,右值引用,編譯器是要為右邊的值生產臨時量的, c已經有記憶體空間了,還需要為他生成臨時量做啥呢?所以右值引用只能專門用來引用右值的,
指令上是通過產生臨時量的方式實現的.


5:為什麼 const int &m =20 可以通過編譯?
實現方式是
int temp=20;
int &m =temp;
編譯器定義了一個臨時量,只是不可以 m=100; 因為 m 是const


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 相信很多前端同學都或多或少和動畫打過交道。有的時候是產品想要的過度效果;有的時候是UI想要的酷炫動畫。但是有沒有人考慮過,是不是我們的頁面上面的每一次變化,都可以像是自然而然的變化;是不是每一次用戶點擊所產生的交互,都可以在頁面上活過來呢? 歡迎你打開了新的前端動畫世界——《Framer Mo ...
  • Vue(V 3.2.37)使用Three.js(V 0.145.0)載入3D模型的詳細步驟 1、安裝three 命令: pnpm install three 引入 three 和載入器 import * as THREE from 'three' import { OBJLoader } from ...
  • 原博客地址 01、描述事件冒泡的流程,可畫圖 考察點:事件基礎知識 參考答案: // 基於DOM樹結構,事件會順著觸發元素向上冒泡 // 阻止冒泡 event.stopPropagation(); 點擊一個div,會一級一級向父級、爺級元素上冒泡,這個點擊事件不僅能被這個div捕捉到,也能被他的父級 ...
  • Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、授權、密碼和會話管理。使用Shiro的易於理解的API,您可以快速、輕鬆地獲得任何應用程式,從最小的移動應用程式到最大的網路和企業應用程式。 ...
  • 1. 凱撒加密演算法 1.1 演算法邏輯 根據一個固定偏移值(offset), 將字母向一個方向偏移, 進行加密. 1.2 初步思路 獲取明文(plaintext) 獲取明文字元串的單獨字元 進行字元值偏移 當偏移超出字母範圍時, 回到第一個字母處繼續偏移. 得到密文(ciphertext) 1.3 初 ...
  • 以下為本人的學習筆記 1.認識Annotation JDK1.5開始,java增加了對元數據(即類的組成單元數據)的支持,也就是(Annotation)註解,它是代碼里做的特殊標記,這些標記可以在編譯,類載入,運行時在不改變原有邏輯的情況下,被讀取(通過反射來讀取),並執行相應 的處理,通過使用An ...
  • 2022-10-28 Tomcat (1)含義:Tomcat是一個使用廣泛的JavaWeb伺服器。 (2)官方下載地址: https://tomcat.apache.org/ 使用8.0版本的就OK。 (3)在使用Tomcat之前需要的準備工作: 正確配置JAVA_HOME的環境變數,配置的內容是j ...
  • 本次案例代碼實現思路: 打開考試網站 selenium --> 瀏覽器驅動 --> 操作瀏覽器 <模擬人的行為做操作瀏覽器> 獲取答案 獲取答案網站鏈接 獲取問題以及答案內容 對比題目以及答案 選出正確答案 獲取問題答案選項 和正確的答案進行對比 如果正確答案和選擇答案一致, 那就進行點擊 進行點擊 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...