c++ 中的關(guān)鍵字 const含義詳解
c++ 中的關(guān)鍵字 const 是什么意思?
C++ 中的 const 關(guān)鍵字是一個(gè)強(qiáng)大的工具,主要用于定義“只讀”變量或?qū)ο?,告訴編譯器和程序員,被其修飾的內(nèi)容不應(yīng)被改變。它的核心價(jià)值在于增強(qiáng)代碼的健壯性和安全性,防止數(shù)據(jù)被意外修改,同時(shí)有時(shí)也能幫助編譯器進(jìn)行優(yōu)化。
下面這個(gè)表格匯總了 const 關(guān)鍵的主要應(yīng)用場(chǎng)景和核心含義,方便你快速了解:
| 應(yīng)用場(chǎng)景 | 核心含義 | 代碼示例 |
|---|---|---|
| 修飾普通變量 | 變量值在初始化后不可更改,必須在定義時(shí)初始化。 | const int maxSize = 100; |
| 修飾指針 | 情況多樣,取決于 const 在 * 號(hào)前還是后,具體見(jiàn)下文詳解。 | const int *p; / int *const p; |
| 修飾函數(shù)參數(shù) | 函數(shù)內(nèi)部不能修改該參數(shù)的值,常用于指針或引用參數(shù)以保護(hù)原始數(shù)據(jù)。 | void func(const MyClass& obj); |
| 修飾類成員函數(shù) | 該成員函數(shù)承諾不會(huì)修改類的任何非 mutable 成員變量。 | int getValue() const; |
| 修飾函數(shù)返回值 | 函數(shù)的返回值(通常是指針或引用)不能被修改。 | const char* getString(); |
?? 理解指針與const的搭配
const 與指針的結(jié)合是理解的關(guān)鍵和難點(diǎn),主要有三種情況,可以借助“左定值,右定向”的口訣來(lái)記憶(const 在 * 左邊,限定的是指針指向的數(shù)據(jù);在 * 右邊,限定的是指針本身):
- 指向常量的指針(常量指針)
- 聲明方式:
const int *p;或int const *p; - 這表示指針指向的數(shù)據(jù)是常量,不能通過(guò)這個(gè)指針來(lái)修改該數(shù)據(jù)。但指針本身可以指向別的地址。
int a = 10, b = 20; const int *p = &a; // p 指向 a // *p = 15; // 錯(cuò)誤!不能通過(guò) p 修改 a 的值 p = &b; // 正確!指針 p 可以改為指向 b cout << *p; // 正確,輸出 20
- 指針常量
- 聲明方式:
int *const p = &a;// 注意:這種形式必須在聲明時(shí)初始化 - 這表示指針本身是常量,一旦初始化指向某個(gè)地址后,就不能再指向其他地址。但可以通過(guò)這個(gè)指針修改它所指向的數(shù)據(jù)。
int a = 10, b = 20; int *const p = &a; // p 將始終指向 a *p = 15; // 正確!可以通過(guò) p 將 a 的值改為 15 // p = &b; // 錯(cuò)誤!指針 p 本身不能改變指向
- 指向常量的指針常量
- 聲明方式:
const int *const p = &a; - 這是最嚴(yán)格的形式,意味著指針本身不能改變指向,同時(shí)也不能通過(guò)它修改指向的數(shù)據(jù)。
int a = 10; const int *const p = &a; // *p = 15; // 錯(cuò)誤!不能通過(guò) p 修改 a // p = &someOtherVar; // 錯(cuò)誤!p 不能指向別處
?? 其他重要應(yīng)用場(chǎng)景
修飾函數(shù)參數(shù)
將函數(shù)參數(shù)聲明為常量引用(如void func(const MyClass& obj))是一種非常常見(jiàn)且推薦的做法。這樣做有兩個(gè)主要好處:- 安全:保證函數(shù)內(nèi)部不會(huì)意外修改原始對(duì)象的值。
- 高效:對(duì)于自定義類型(如類、結(jié)構(gòu)體),避免了值傳遞時(shí)整個(gè)對(duì)象的復(fù)制開(kāi)銷,效率遠(yuǎn)高于值傳遞(
void func(MyClass obj))。
對(duì)于內(nèi)置基本類型(如int,double),通常直接使用值傳遞即可,因?yàn)閺?fù)制開(kāi)銷很小。
- 修飾類成員函數(shù)
- 在成員函數(shù)聲明的最后加上
const,表示這個(gè)函數(shù)不會(huì)修改該對(duì)象的任何成員變量(除非成員變量被mutable關(guān)鍵字修飾)。
- 在成員函數(shù)聲明的最后加上
class Counter {
public:
int getCount() const { // 承諾不修改成員變量
// value++; // 錯(cuò)誤!const 成員函數(shù)內(nèi)不能修改非 mutable 成員
return value;
}
void increment() { // 非 const 成員函數(shù),可以修改
value++;
}
private:
int value = 0;
mutable int accessTimes = 0; // mutable 成員,即使在 const 函數(shù)中也可被修改
};規(guī)則:const 對(duì)象(如 const Counter c;)只能調(diào)用其 const 成員函數(shù),而非 const 對(duì)象可以調(diào)用所有成員函數(shù)。
- 修飾函數(shù)返回值
- 當(dāng)函數(shù)返回一個(gè)指針或引用時(shí),用
const修飾可以防止返回的值被用作左值(即被賦值)。
- 當(dāng)函數(shù)返回一個(gè)指針或引用時(shí),用
const char* getGreeting() {
return "Hello, World!";
}
// getGreeting()[0] = 'h'; // 錯(cuò)誤!嘗試修改常量數(shù)據(jù)
?? 頂層 const 與底層 const
這是一個(gè)有助于你更精確理解 const 屬性的概念:
- 頂層 const:表示變量(或指針)本身是個(gè)常量。例如
int *const p中的const是頂層 const。 - 底層 const:表示指針或引用所指向的對(duì)象是一個(gè)常量。例如
const int *p中的const是底層 const。
?? 使用 const 的好處
- 增強(qiáng)代碼可讀性:看到
const,你就知道這個(gè)值不應(yīng)該被改變,代碼意圖更清晰。 - 提高程序健壯性:編譯器會(huì)幫你檢查是否有違反
const約束的修改操作,將許多潛在錯(cuò)誤扼殺在編譯階段。 - 幫助編譯器優(yōu)化:編譯器知道某些值不變后,可能進(jìn)行更積極的優(yōu)化。
?? 注意 const 的局限性
需要注意的是,const 主要提供的是編譯期的保護(hù)。它并不能絕對(duì)阻止在運(yùn)行時(shí)通過(guò)某些方式(如強(qiáng)制類型轉(zhuǎn)換或直接操作內(nèi)存)修改被定義為常量的數(shù)據(jù),但這類操作通常是危險(xiǎn)且不推薦的。
希望這些解釋能幫助你透徹理解 C++ 中的 const 關(guān)鍵字。它是一個(gè)非常強(qiáng)大的助手,善用它可以寫(xiě)出更安全、更清晰的代碼。
(注:文檔部分內(nèi)容可能由 AI 生成)
到此這篇關(guān)于c++ 中的關(guān)鍵字 const含義詳解的文章就介紹到這了,更多相關(guān)c++ 關(guān)鍵字 const內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++中的static和const的關(guān)鍵字用法詳解
- C++命名空間?缺省參數(shù)?const總結(jié)?引用總結(jié)?內(nèi)聯(lián)函數(shù)?auto關(guān)鍵字詳解
- C++關(guān)鍵字const使用方法詳解
- C++?右值引用與?const?關(guān)鍵字詳解
- 初識(shí)C++的const關(guān)鍵字,常量與常變量
- C++11?關(guān)鍵字?const?使用小結(jié)
- c++關(guān)鍵字const的用法詳解
- C++ const關(guān)鍵字的實(shí)例用法
- C++語(yǔ)言const 關(guān)鍵字使用方法圖文詳解
相關(guān)文章
C#實(shí)現(xiàn)防止重復(fù)提交的代碼詳解
當(dāng)用戶在前端進(jìn)行提交數(shù)據(jù)時(shí),如果網(wǎng)絡(luò)出現(xiàn)卡頓和前端沒(méi)有給出響應(yīng)的話顧客通常都會(huì)狂點(diǎn)提交按鈕,這樣就很容易導(dǎo)致后端數(shù)據(jù)造成臟數(shù)據(jù),所以本文給大家介紹了如何避免C#重復(fù)提交,需要的朋友可以參考下2025-09-09
C#使用Http Post方式傳遞Json數(shù)據(jù)字符串調(diào)用Web Service
這篇文章主要為大家詳細(xì)介紹了C#使用Http Post方式傳遞Json數(shù)據(jù)字符串調(diào)用Web Service,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
C#實(shí)現(xiàn)金額轉(zhuǎn)換成中文大寫(xiě)金額
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)金額轉(zhuǎn)換成中文大寫(xiě)金額,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
C#數(shù)據(jù)綁定(DataBinding)簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了C#數(shù)據(jù)綁定(DataBinding)簡(jiǎn)單實(shí)現(xiàn)方法,以簡(jiǎn)單實(shí)例形式簡(jiǎn)單分析了C#實(shí)現(xiàn)數(shù)據(jù)綁定與讀取的方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
如何用WindowsForm給窗口添加一些簡(jiǎn)單的動(dòng)畫(huà)效果
這篇文章主要介紹了如何用WindowsForm給窗口添加一些簡(jiǎn)單的動(dòng)畫(huà)效果,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
Unity3D實(shí)現(xiàn)攝像機(jī)鏡頭移動(dòng)并限制角度
這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)攝像機(jī)鏡頭移動(dòng)并限制角度,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05

