【C++】const詳解

📢博客主頁:https://blog.csdn.net/2301_779549673
📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
📢本文作為 JohnKi ,引用了部分大佬的案例
📢未來很長,值得我們全力奔赴更美好的生活?

在這里插入圖片描述

在這里插入圖片描述

文章目錄

  • 📢前言
  • 🏳??🌈const 的修飾范疇
    • ??1. 修飾一般常量和數組
    • 🧡2. 修飾指針
    • 💛3.修飾函數參數
    • 💚4. 修飾函數返回值
    • 💙5. 修飾成員函數
  • 🏳??🌈使用const的好處
  • 🏳??🌈const在C和C++中的區別


📢前言

  • C++ 中的 const 關鍵字的用法非常靈活,而使用 const 將大大改善程序的健壯性
  • const 是 C++ 中常見的類型修飾符,常類型是指使用類型修飾符 const 說明的類型,常類型的變量或對象的值是不能被更新的
  • const 名叫常量限定符,用來限定特定變量,以通知編譯器該變量是不可修改的。習慣性的使用const,可以避免在函數中對某些不應修改的變量造成可能的改動。

🏳??🌈const 的修飾范疇

??1. 修飾一般常量和數組

int const a = 100;
const int a = 100; //與上面等價
int const arr [3] = {1,2,3};
const int arr [3] = {1,2,3};//與上面等價

🧡2. 修飾指針

char *p = "hello";     // 非const指針,非const數據const char *p = "hello";  // 非const指針,const數據char * const p = "hello";   // const指針,非const數據const char * const p = "hello";  // const指針,const數據
  • 如果const位于星號*的左側,則const就是用來修飾指針所指向的變量,即指針指向為常量;

  • 如果const位于星號*的右側,const就是修飾指針本身,即指針本身是常量。

💛3.修飾函數參數

const 常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查,而對后者只進行字符替換,沒有類型檢查,并且在字符替換時可能產生意料不到的錯誤

void f(const int i){……}
//對傳入的參數進行類型檢查,不匹配進行提示

如果函數作為輸出用,不論是什么數據類型,也不論采用指針傳遞還是引用傳遞,都不能加const 修飾,否則參數會失去輸出功能。

💚4. 修飾函數返回值

const 修飾函數返回值其實用的并不多,它的含義和 const 修飾普通變量以及指針的含義基本相同

1. const int func1();  //這個其實沒多大意義,因為參數返回就是賦值
2. const int* func2(); //調用時:const int* p = func2(); 可以把 func2() 當作一個變量,即指針內容不可變
3. int* const func3(); //調用時:int* const p = func3(); 以把 func2() 當作一個變量,即指針本身不可變
  • 一般情況下,函數的返回值為某個對象時,如果將其聲明為 const 時,多用于操作符的重載。通常,不建議用 const 修飾函數的返回值類型為某個對象或者某個對象的引用的情況。
  • 原因如下: 如果返回值為某個對象為 const(比如:const A test = A; )或某個對象的引用為 const(const A& test = A;),則返回值具有 const 屬性,則返回實例只能訪問類 A 中的公有或保護數據成員和 const 成員函數,并且不允許對其進行賦值操作,這在一般情況下很少用到。

💙5. 修飾成員函數

const 修飾類的成員函數,則該成員函數不能修改類中任何非 const 成員函數,一般寫在函數的最后來修飾

class A{void func() const{} //常成員函數,它不能改變對象的成員變量,也不能調用類中任何非 const 成員函數
};

規則如下

  1. const 對象只能訪問const 成員函數,非const 的對象可以訪問任何成員函數,包括const 成員函數。
  2. 如果函數名、參數、返回值都相同的const成員函數和非const成員函數是可以構成重載,那么const對象調用const成員函數,非const對象默認調用非const的成員函數。
  3. const成員函數可以訪問所有成員變量,但是只能訪問const的成員函數。
  4. 非const成員函數,可以訪問任何成員,包括const成員成員函數。
  5. onst成員函數不能修改任何的成員變量,除非變量用mutable修飾。

🏳??🌈使用const的好處

可以定義const常量
這樣可以避免由于無意間修改數據而導致的編程錯誤,提供了一個保護作用。

便于進行類型檢查
const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查,而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換時可能會產生意料不到的錯誤。

為函數重載提供了一個參考
const修飾的函數可以看作是對同名函數的重載。

可以節省空間,避免不必要的內存分配
const定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是象宏一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而宏定義的常量在內存中有若干個拷貝。

提高了效率
編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。

🏳??🌈const在C和C++中的區別

  1. 在C語言中,用const修飾的變量,其本質上還是個變量,只是它不允許作為左值存在,也就是不法對該變量進行直接賦值修改該變量,但是這不意味著該變量的值就無法修改。

  2. 在C++中 ,在編譯的時候,當碰到用const修飾的變量時,編譯器是直接將變量的值和變量的符號對應起來一起存到符號表

  3. 例如const int a = 5;在符號表中就會將a和5對應起來,在編譯的過程中,當碰到printf(“a = %d\n”,a); 時,用 5 直接將 a 替換掉。在C++中,編譯器不會為a分配存儲空間,在C語言中就會為a分配存儲空間,所以在C編譯器中,就可以通過指針來改變用const修飾的變量

  4. 其實在C++中,const修飾的變量,在編譯的時候如果前面有extern和取地址符 & 時,會為變量分配存儲空間是為了兼容C語言,但是在C++中,用const修飾的變量就真的無法修改它的值,可以說是常量。但是在C語言中,const修飾的變量本質上還是變量而不是常量。這在C語言中其實也是矛盾的,因為我們想要用const定義一個常量,但又可以通過指針來改變該常量的值。而C++為了兼容C語言,所以保留了這個特性,但是卻無法修改它的值,這就是const在C語言和C++中的區別。


本篇博文對 const 做了一個較為詳細的介紹,不知道對你有沒有幫助呢

覺得博主寫得還不錯的三連支持下吧!會繼續努力的~

請添加圖片描述

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

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

相關文章

Android 常用文件系統命令

Android 常用文件系統命令 當系統正在對某個文件系統的區域進行寫入操作時(讀的話沒關系),突然斷電,會造成文件系統對應區域的損壞(如寫入臟數據), 而e2fsck算法就是用來恢復受損的文件系統&am…

力扣1177.構建回文串檢測

力扣1177.構建回文串檢測 因為子串可以重新排序 因此考慮一下什么情況需要替換字母1.當前有一個字母的數量為奇數 需要替換的次數為0 2.當前有二個字母的數量為奇數 需要替換的次數為1 (奇數個a 奇數個b 需要將b -> a) 3.當前有三個字母的數量為奇數 需要替換的次數為1 4.當…

Edge瀏覽器選中后,出現AI智能生成 AI專業寫作

這個是擴展里邊的“ 網頁萬能復制 & ChatGPT AI寫作助手”造成的,這個拓展增加了AI寫作功能。關閉這個拓展就解決了。

入門Axure:快速掌握原型設計技能

2002 年,維克托和馬丁在舊金山灣區的一家初創公司工作,發現自己一再被軟件開發生命周期的限制所困擾,而且產品團隊在編寫規范之前很難評估他們的解決方案,開發人員經常不理解(或不閱讀)給出的規范&#xff…

承載網與核心網的區別

承載網和核心網是通信網絡中的兩個重要組成部分,它們有以下主要區別: 功能方面: 承載網主要負責提供數據傳輸的通道和鏈路,確保各種業務數據能夠在網絡中高效、可靠地傳輸。它類似于通信網絡中的“道路”,專注于數據的…

【linux學習---1】點亮一個LED---驅動一個GPIO

文章目錄 1、原理圖找對應引腳2、IO復用3、IO配置4、GPIO配置5、GPIO時鐘使能6、總結 1、原理圖找對應引腳 從上圖 可以看出, 蜂鳴器 接到了 BEEP 上, BEEP 就是 GPIO5_IO05 2、IO復用 查找IMX6UL參考手冊 和 STM32一樣,如果某個 IO 要作為…

14-16 AI Agent:您無法忽視的盈利未來

忘掉關于機器人接管我們工作的爭論吧。一場更加微妙、可能更有利可圖的革命正在醞釀之中——智能代理的崛起,而智能代理的光芒常常被其更簡單的“表親”虛擬助理所掩蓋。 雖然 Siri 和 Alexa 可以處理基本任務和基本對話,但人工智能代理則完全不同。想象…

HTML5的多線程技術:Web Worker API

Web Workers API 是HTML5的一項技術,它允許在瀏覽器后臺獨立于主線程運行腳本,即允許進行多線程處理。這對于執行密集型計算任務特別有用,因為它可以防止這些任務阻塞用戶界面,從而保持網頁的響應性和交互性。Web Workers在自己的…

中國動物志(140卷)

中國動物志,共140卷,包括昆蟲綱、鳥綱、獸綱、無脊椎動物、硬骨魚綱等多類,是反映我國動物分類區系研究工作成果的系列專著,是研究物種多樣性、探討物種演化和系統發育的重要參考,是動物資源開發利用、有害物種控制、瀕…

昇思25天學習打卡營第12天|linchenfengxue

DCGAN生成漫畫頭像 通過示例代碼說明DCGAN網絡如何設置網絡、優化器、如何計算損失函數以及如何初始化模型權重。 GAN基礎原理 生成式對抗網絡(Generative Adversarial Networks,GAN)是一種生成式機器學習模型,是近年來復雜分布上無監督學習最具前景的…

esp32 模擬藍牙鍵盤不生效一例

esp32 使用 GitHub - T-vK/ESP32-BLE-Keyboard: Bluetooth LE Keyboard library for the ESP32 (Arduino IDE compatible) 這個開源庫模擬鍵盤功能早之前已經玩過,生效,昨天再來玩的時候發覺莫名奇妙居然又不能用了,各種折騰:換了…

如何在Java中使用Kafka

如何在Java中使用Kafka 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! Kafka是一個分布式流處理平臺,廣泛用于實時數據流的處理和傳輸。本文將詳細…

什么是Web3D交互展示?有什么優勢?

在智能互聯網蓬勃發展的時代,傳統的圖片、文字及視頻等展示手段因缺乏互動性,正逐漸在吸引用戶注意力和提升宣傳效果上顯得力不從心。而Web3D交互展示技術的橫空出世,則為眾多品牌與企業開啟了一扇全新的展示之門,讓線上產品體驗從…

【C語言】extern 關鍵字

在C語言中,extern關鍵字用于聲明一個變量或函數是定義在另一個文件中的。它使得在多個文件之間共享變量或函數成為可能。extern關鍵字常見于大型項目中,通常用于聲明全局變量或函數,這些變量或函數的定義位于其他文件中。 基本用法 變量聲明…

Python基礎入門知識

目錄 引言 簡要介紹Python語言 為什么要學習Python Python的應用領域 Python安裝和環境配置 Python的下載和安裝(Windows, macOS, Linux) 配置Python環境變量 安裝和使用IDE(如PyCharm, VS Code) Python基本語法 注釋 變量和數據類型(數字,字符串,列表,元組,字典,…

P3374 【模板】樹狀數組 1

題目描述 如題,已知一個數列,你需要進行下面兩種操作: 將某一個數加上 𝑥x 求出某區間每一個數的和 輸入格式 第一行包含兩個正整數 𝑛,𝑚n,m,分別表示該數列數字的個數和操作的總個數。 …

<sa8650>sa8650 qcxserver-之-攝像頭傳感器VB56G4A驅動開發<1>

<sa8650>sa8650 qcxserver-之-攝像頭傳感器VB56G4A驅動開發 <1> 一、前言二、QCX架構三、QCX 傳感器驅動程序定制開發3.1 sensor硬件接口3.2 sensor配置文件3.2.1 cameraconfig.c3.2.2 cameraconfigsa8650_water.c3.2.3 新增編譯MK3.2.4 參數解析3.2.4.1 struct Camera…

干式電抗器的工作原理是什么

干式電抗器是電力系統中常用的無功補償設備&#xff0c;主要用于調節電網的電壓、提高功率因數、限制短路電流等。它的工作原理主要是通過在電路中引入一個與負載電流相反的磁場&#xff0c;從而產生一個與負載電流相抵消的電抗力&#xff0c;達到調節電壓和功率因數的目的。 干…

常微分方程算法之編程示例十-兩點狄利克雷邊值問題(理查德森外推法)

目錄 一、研究問題 二、C++代碼 三、計算結果 一、研究問題 本節我們采用理查德森法對示例八中的兩點狄利克雷邊值問題進行外推求解,相應的原理及推導思路請參考: 常微分方程算法之高精度算法(Richardson法+緊差分法)_richardson外推法-CSDN博客https://blog.csdn.net/…

20_系統測試與維護

目錄 測試基礎知識 測試原則 動態測試 靜態測試 測試策略 測試階段 測試用例設計 黑盒測試用例設計 白盒測試用例設計 McCabe度量法 魯棒性測試 缺陷探測率(Defect Detection Percentage,DDP) 調試 系統維護基礎 系統轉換 系統維護指標 軟件容錯技術 嵌入式安…