C++ 左值引用與 const 關鍵字

来源:https://www.cnblogs.com/young520/archive/2022/09/18/16705812.html
-Advertisement-
Play Games

左值引用是已定義的變數的別名,其主要用途是用作函數的形參,將 const 關鍵字用於左值引用時,其在初始化時可接受的賦值形式變得更加廣泛了,這裡來總結一下。 ...


左值引用是已定義的變數的別名,其主要用途是用作函數的形參,通過將左值引用變數用作參數,函數將使用原始數據,而不是副本。引用變數必須在聲明時同時初始化,可將 const 關鍵字用於左值引用,如下所示:

//聲明並初始化常規左值引用變數
int x = 55;
int & rx = x;

//將const關鍵字用於左值引用變數,以下幾種為等效表示
int x = 55;
const int & crx = x;
int const & crx = x;

Microsoft Visual Studio 中連續多個 const 會被編譯器解釋成一個,即 const const const const int &const int & 等效,除此之外,const int const &Microsoft Visual Studio 中也與 const int & 等效,而 int & constQT 中將會報錯,在 Microsoft Visual Studio 中與 int & 等效。

以上兩種類型左值引用的特性如下(舊版 C++ 可能與下列特性不十分吻合,以 C++11 為準):

  • 類型為 int & 的引用 rx 只能作為已有變數的別名,不會生成臨時變數,可修改所引用變數的值,可將 int 變數、int & 變數、int * 指針所指變數、int *const 指針所指變數在初始化時賦給 rx接受可通過地址訪問的非 const 變數),必須在聲明時初始化,後續無法更換所引用的變數。變數初始化完成後,其表現與 int 類型一致。

  • 類型為 const int & 的引用 crx 既可作為已有變數的別名,也可在合適的時候生成臨時變數,成為該臨時變數的別名,但不可修改所引用變數的值,可將 int 變數、const int 變數、int & 變數、const int & 變數、int * 指針所指變數、int *const 指針所指變數、const int * 指針所指變數、const int *const 指針所指變數、類型為 int 的非左值(比如字面常量 100、多項表達式 1+50*2)、類型不是 int 但可轉換為 int 的變數或非左值(比如 short 變數、多項表達式 1.0+50.0*2.0、字面常量 100.0)在初始化時賦給 crx,也必須在聲明時初始化,後續無法更換所引用的變數。變數初始化完成後,其表現與 const int 類型一致。

常規左值引用變數的初始化用法如下:

//初始化用法一:作為short變數別名
short x = 55;
short & rx = x;
cout << x;  //結果為55
cout << rx; //結果為55
cout << &x; //32位系統結果為0x0093F7BC
cout << &rx;//32位系統結果為0x0093F7BC
cout << sizeof(x); //結果為2
cout << sizeof(rx);//結果為2

//初始化用法二:作為short變數別名,多層引用
short x = 55;
short & rx = x;
short & rxx = rx;

//初始化用法三:作為short變數別名,指針表示法,指針為short*
short x = 55;
short * px = &x;
short & rx = *px;

//初始化用法四:作為short變數別名,指針表示法,指針為short *const
short x = 55;
short * const px = &x;
short & rx = *px;

const 關鍵字修飾的左值引用變數初始化用法如下:

//初始化用法一:作為short變數別名
short x = 55;
const short & rx = x;

//初始化用法二:作為const short變數別名
const short x = 55;
const short & rx = x;

//初始化用法三:作為short變數別名,多層引用
short x = 55;
short & rx = x;
const short & rxx = rx;

//初始化用法四:作為short變數別名,多層引用,第一層引用為const
short x = 55;
const short & rx = x;
const short & rxx = rx;

//初始化用法五:作為short變數別名,指針表示法,指針為short*
short x = 55;
short * px = &x;
const short & rx = *px;

//初始化用法六:作為short變數別名,指針表示法,指針為const short*
short x = 55;
const short * px = &x;
const short & rx = *px;

//初始化用法七:作為short變數別名,指針表示法,指針為short *const
short x = 55;
short *const px = &x;
const short & rx = *px;

//初始化用法八:作為short變數別名,指針表示法,指針為const short *const
short x = 55;
const short *const px = &x;
const short & rx = *px;

//初始化用法九:將創建臨時變數,類型為int的非左值,字面常量
const int & rx = 100;

//初始化用法十:將創建臨時變數,類型為int的非左值,多項表達式
const int & rx = 1+50*2;

//初始化用法十一:將創建臨時變數,類型不是int但可轉換為int的變數
short x = 55;
const int & rx = x;
cout << x;  //結果為55
cout << rx; //結果為55
cout << &x; //32位系統結果為0x006FFCF0
cout << &rx;//32位系統結果為0x006FFCD8
cout << sizeof(x); //結果為2
cout << sizeof(rx);//結果為4

//初始化用法十二:將創建臨時變數,類型不是int但可轉換為int的非左值,字面常量
const int & rx = 100.0;

//初始化用法十三:將創建臨時變數,類型不是int但可轉換為int的非左值,多項表達式
const int & rx = 1.0+50.0*2.0;

將初始化時 int &const int & 可接受的形式列個表,如下:

初始化時可接受的形式 int & 類型 const int & 類型
int 變數 可以 可以
const int 變數 不可以 可以
int & 變數 可以 可以
const int & 變數 不可以 可以
int * 所指變數 可以 可以
int * const 所指變數 可以 可以
const int * 所指變數 不可以 可以
const int * const 所指變數 不可以 可以
形如 100int 字面常量 不可以 可以(將創建臨時變數)
形如 1+50*2int 多項表達式 不可以 可以(將創建臨時變數)
類型可以轉換為 int 的變數 不可以 可以(將創建臨時變數)
形如 100.0 可轉換為 int 的字面常量 不可以 可以(將創建臨時變數)
形如 1.0+50.0*2.0 可轉換為 int 的多項表達式 不可以 可以(將創建臨時變數)

本文作者:木三百川

本文鏈接:https://www.cnblogs.com/young520/p/16705812.html

版權聲明:本文系博主原創文章,著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請附上出處鏈接。遵循 署名-非商業性使用-相同方式共用 4.0 國際版 (CC BY-NC-SA 4.0) 版權協議。


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

-Advertisement-
Play Games
更多相關文章
  • 在寫開源項目的時候,想到了要支持多種redis部署方式,於是對於這塊的生產環境的架構選型展開調研。 推薦使用更新的引擎版本以支持更多的特性, Redis 6.0新特性說明 模塊系統新增多個API。 支持SSL/TLS加密。 支持新的Redis協議:RESP3。 服務端支持多模式的客... ...
  • 我的設計模式之旅。本節詳細說明單例模式的實現方式、優缺點,簡要描述多線程情況下利用雙重鎖定保護單例對象和C#靜態初始化的方式。並用 Golang 實現單例模式,三個工作者需要各自找到電梯搭乘,只有一個電梯!補充C#單線程單例模式的實現。 ...
  • 目錄 一.OpenGL 圖像反色 1.原始圖片 2.效果演示 二.OpenGL 圖像反色源碼下載 三.猜你喜歡 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> ...
  • 我的博客 俗話說,工欲善其事必先利其器,所以在使用日期前要先對日期進行處理,所以時間戳和字元串的來回來去轉換這個事肯定是要搞的 這次的函數有一個?有兩個?有三個?有四個!上代碼! 哈哈,像不像直播帶貨 本次用到3個內置包 import reimport timeimport calendar 第一個 ...
  • 1. auth模塊 在創建完django項目之後,執行資料庫遷移之後,資料庫里會增加很多新表,其中有一張名為auth_user的表,當訪問django自帶的路由admin的時候,需要輸入用戶名和密碼,其參照的就是auth_user表 使用python3 manage.py crataesupperu ...
  • 在Spring的簡介中我們知道了Spring的核心是控制反轉(ICO)和麵向切麵編程(AOP),我們不直接對ICO進行學習,而是先學習ICO的理論推導。 這是我一個maven項目的結構。 UserDao: package com.jms.dao; public interface UserDao { ...
  • 操作步驟 先設置輸入路徑與輸出路徑 輸入路徑:需要被轉換的文件路徑 輸出路徑:轉換後的文件儲存路徑 我沒有寫這個屬性的交互操作,只是在第一行用字面量進行設置 如果輸出路徑的目錄不存在,則就會進行交互,是否創建該目錄,如果不創建就退出程式 再是選擇字元集轉換的類型,是全部文件預設使用同一套字元集轉換, ...
  • **註:**本文所有函數名為中文名,並不符合代碼規範,僅供讀者理解參考。 Goroutine Go程不是OS線程,也不是綠色線程(語言運行時管理的線程),而是更高級別的抽象,一種特殊的協程。是一種非搶占式的簡單併發子goroutine(函數、閉包、方法)。不能被中斷,但有多個point可以暫停或重新 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...