關於c++中的const的總結

来源:https://www.cnblogs.com/halftheworldaway/archive/2022/04/19/16165705.html
-Advertisement-
Play Games

1.為什麼要用const const本質上其實不僅僅是對變數的一個限定符,更是對程式員的一個限定符,它提醒了程式員,通過const限定的變數的值是不應該被更改的,並且當編譯器得知變數或者表達式的求值結果是恆定的時候,編譯器也可以在編譯期大展拳腳,為我們做出一些編譯期優化,進而提高我們的程式在運行時的 ...


1.為什麼要用const

const本質上其實不僅僅是對變數的一個限定符,更是對程式員的一個限定符,它提醒了程式員,通過const限定的變數的值是不應該被更改的,並且當編譯器得知變數或者表達式的求值結果是恆定的時候,編譯器也可以在編譯期大展拳腳,為我們做出一些編譯期優化,進而提高我們的程式在運行時的性能(例如編譯器會在編譯時直接將字面值常量插入我們的代碼段)。

2.const的基本用法

  • 用來進行基本類型變數的聲明
    /*const變數在初始化的時候必須賦予值*/
    int z;//正確: 常規變數初始化可不給明確值
    const int x = 5; //正確: 以字面值常量5來進行初始化
    //const int y;  錯誤:const變數的聲明必須進行初始化
    const int y = z; //正確:const型的變數可以被非const型變數進行初始化
    
    /*const變數不允許被修改*/
    //x = 3; y = 3 錯誤:不允許對const型變數進行修改
    
  • 用來對指針或者引用這種複合類型進行聲明
    /*關於常量指針與指針常量*/
    int value = 5;
    const int c_value = 5;
    const int* p = &value; //正確:pointer to const 可以被常規變數地址初始化
    const int* p1 = &c_value; //正確:pointer to const 可以被const變數地址初始化
    //*p = 3, *p1 = 3 錯誤:無法通過pointer to const來改變所指向變數的值
    
    int* const p2 = &value; //正確: 聲明一個const pointer
    *p2 = 3; //正確: 可以通過const pointer來更改它所指向的值
    //p2 = &c_value; 錯誤: const pointer所指向的地址無法被修改
    
    /*引用類型與指針類型類似*/
    const int& cref = value; //正確: 可通過常規變數初始化
    const int& cref_1 = c_value;//正確: 可以通過const變數初始化
    //cref = 4 錯誤: 不可通過reference to const改變原變數的值
    
    其實在c++primer中,對於const修飾指針的這種情況有一個非常好的說明:

    指針本身是一個對象,它又可以指向另一個對象。因此,指針本身是不是常量以及指針所指的是不是一個常量就是兩個相互獨立的問題。用名詞頂層const表示指針本身是一個常量,而用名詞底層const表示指針所指的對象是一個常量。

  • 用於面向對象程式相關設計時
    class base {
        private:
            int m_data;
            mutable int m_data_1;
        public:
            void print() const {cout << "Const version!\n";} //聲明一個const型的函數
            void print() {cout << "Non const version\n";} //同名非const型函數,可以與上面函數構成重載
            // void set(int x) const {m_data = x;} 錯誤:不能在const成員函數中改變m_data的值 
            void set(int x) const {m_data_1 = x;} //正確:可以對mutable變數進行修改
    }
    //並且當實例化一個const base對象時,其只能調用其常成員函數。
    

3.總結

在初始化時,const型變數往往沒有特別嚴格的要求,無論用const變數,字面值常量還是常規變數來進行初始化都是合法的操作,但是一旦初始化完成後,const變數便開始拒絕修改操作,並且我們可以將這個性質推廣到類的成員函數之上,類的常成員函數不可以對內部成員變數進行修改(大部分情況下),而至於通過類實例化的常對象也只能調用我們的常成員函數。總的來說,const可以讓我們的程式更加安全,通過這種編譯時的檢查,我們可以確保一些我們不想變更的值保持其原本的樣子。


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

-Advertisement-
Play Games
更多相關文章
  • 本文實現用Python將文本文件自動保存到Excel表格裡面去。 需求 將錦江區.txt 文件中的數據整理到 錦江區.xlsx 的 錦江區 sheet ; 將推薦菜欄位丟棄(保留前面14個欄位) ; 將人均消費中的 ¥ 符號去掉,如果價格為空整條數據都不要; 成果展示 txt文本部分數據 效果 稍微 ...
  • 1.導包(配置pom.xml) 一定要用這個網站:https://mvnrepository.com/ 點擊查看代碼 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.4 ...
  • 控制小數位數 控制數值變大變小 數字轉漢字格式 引入 cn.hutool.core.convert 包 ...
  • 車牌識別在高速公路中有著廣泛的應用,比如我們常見的電子收費(ETC)系統和交通違章車輛的檢測,除此之外像小區或地下 車庫門禁也會用到,基本上凡是需要對車輛進行身份檢測的地方都會用到。 簡介 車牌識別系統(Vehicle License Plate Recognition)是電腦視頻圖像識別技術在車 ...
  • Pillow 圖片處理模塊 Pillow是Python第三方庫,Python2中有一個叫PIL(Python Imaging Library)的標準庫,但不支持Python3,所以一些志願者在PIL的基礎上創建了Pillow,支持Python3。Pillow支持動態圖像編輯。 安裝Pillow pi ...
  • 背景 外媒The Register報道,甲骨文稽查企業用戶,近期開始將把過去看管較鬆散的Java授權加入。 甲骨文針對標準版Java(Java SE)有2種商業授權。2019年4月甲骨文宣佈Java SE用戶需要付費訂閱,才能取得授權及更新,包括Java SE 7、8或11、12。但到同年9月該公司 ...
  • 一個比特(bit)可以是0,或者是1,8個比特(bit),組成一個位元組(byte)。全為0時代表數字0,全為1時代表數字255。 一個位元組可以表示256個數字,兩個位元組可以表示65536個數字。 更多的位元組,可以有更多的組合,就可以表示更大的數值範圍。 整數可以這麼存,那字元呢?一堆二進位的0和1, ...
  • 前言 本文將記錄學習下如何通過 Python 腳本實現 WIFI 密碼的暴力破解,從而實現免費蹭網。 無圖形界面 先來看看沒有圖形界面版的爆破腳本。 WIFI爆破 Python學習交流Q群:906715085#### import pywifi from pywifi import const im ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...