Const 左邊還是右邊?破解C++中最讓人抓狂的關(guān)鍵字
大家好?。∥沂切】?。
今天咱們來聊一個讓無數(shù)程序員頭疼的話題 —— C++中的 const 關(guān)鍵字。不知道你有沒有過這種經(jīng)歷:剛開始學(xué)C++的時候,看到const int* p和int* const p這兩個東西,腦袋瞬間就懵了?"這兩個到底有啥區(qū)別???const 放左邊放右邊,不都一樣嗎?"
如果你也有這困惑,那今天這篇文章就是專門為你準(zhǔn)備的!咱們用最通俗的語言,把這個"魔鬼"般的關(guān)鍵字徹底搞清楚!
一、先別急著背口訣,理解才是王道
網(wǎng)上有很多口訣,什么"靠誰近就修飾誰",但很多人背了半天還是摸不著頭腦。今天我不想讓你背口訣,我要你真正理解為什么會這樣。
讓我們把這個問題想象成現(xiàn)實(shí)生活中的一個情景:
const就像是一把鎖??,它鎖住的東西就不能改變了。
二、const的兩種基本用法
1. 鎖住普通變量 - 最簡單的const
const int age = 18;
age = 19; // 錯誤!age被const鎖住了,不能改變
這種情況很好理解吧?就是告訴編譯器:"嘿,這個變量不能變,死鎖定在這個值了!"
2. 指針世界的const - 這才是重頭戲
在指針世界里,const就變得有趣了,因?yàn)橹羔槺旧碛袃蓪雍x:
- 指針變量本身(它存的是一個地址)
- 指針指向的內(nèi)容(通過這個地址能找到的值)
所以 const 可以鎖兩種東西:
- 鎖住指針本身,使它不能指向其他地方
- 鎖住指針指向的內(nèi)容,使內(nèi)容不能被修改
現(xiàn)在問題就變得清晰了!
三、const在左在右,差別大了去了!
情況一:const int* p 或 int const* p(兩種寫法等價(jià))
這種情況下,const鎖的是指針指向的內(nèi)容(即*p)。
int num = 10;
const int* p = # // 或者寫成 int const* p = #
*p = 20; // 錯誤!不能通過p修改它指向的內(nèi)容
p = &other_num; // 正確!p本身可以改變,指向別的地方
我們可以這樣記:const和int(類型)挨著,鎖定的就是內(nèi)容。
想象成:"你可以換手機(jī)(p可以變),但不能修改里面的通訊錄(*p不能變)"。
情況二:int* const p
這種情況下,const鎖的是指針變量本身(p)。
int num = 10;
int other_num = 20;
int* const p = #
*p = 30; // 正確!可以通過p修改它指向的內(nèi)容
p = &other_num; // 錯誤!p本身被鎖住了,不能指向別處
這里可以記作:const和變量名挨著,鎖定的就是指針本身。
想象成:"你不能換手機(jī)(p不能變),但可以修改里面的通訊錄(*p可以變)。"
情況三:const int* const p
這是終極形態(tài),兩個 const 都有,指針和內(nèi)容都被鎖住了!
int num = 10;
const int* const p = #
*p = 20; // 錯誤!
p = &other_num; // 錯誤!
想象成:"你不能換手機(jī),也不能修改里面的通訊錄,只能看看而已。"
四、實(shí)用小技巧:從右往左讀
如果你還是覺得復(fù)雜,有一個小技巧:從右往左讀聲明。
- const int* p → p是一個指針,指向 const int
- int* const p → p是一個 const 指針,指向 int
- const int* const p → p是一個 const 指針,指向 const int
五、真實(shí)案例:const在函數(shù)參數(shù)中的應(yīng)用
為什么要用const?不僅僅是為了折磨你,它確實(shí)有重要作用。
防止函數(shù)內(nèi)部修改外部數(shù)據(jù):
// 不安全的函數(shù),可能修改你的數(shù)據(jù)
void process(int* data) {
*data = 0; // 哎呀,你的數(shù)據(jù)被我改了
}
// 安全的函數(shù),保證不會修改你的數(shù)據(jù)
void safeProcess(const int* data) {
*data = 0; // 編譯錯誤!這樣就防止了意外修改
}
傳引用時提高效率又保證安全:
// 這是最常見的const用法
void printBigObject(const BigObject& obj) {
// 通過引用避免了復(fù)制大對象(提高效率)
// 通過const確保函數(shù)不會修改對象(保證安全)
cout << obj.toString() << endl;
}
六、真相了:const其實(shí)很友好
學(xué)會了const,你會發(fā)現(xiàn)它其實(shí)是 C++ 設(shè)計(jì)中很貼心的一部分:
- 幫你避免意外修改不該修改的數(shù)據(jù)
- 讓代碼更清晰,表達(dá)"這個東西不應(yīng)該被修改"的意圖
- 編譯器可以做更多優(yōu)化
七、小結(jié):const記憶口訣
如果你看了前面的解釋還是覺得繞,那就記住這一句話:
const和誰在一起(挨著誰),就鎖定誰
- const int* p:const和int(類型)挨著,鎖定的是內(nèi)容
- int* const p:const和p挨著,鎖定的是指針本身
看到?jīng)]?就這么簡單!
啥?你說還有int const* p這種寫法?這個其實(shí)等價(jià)于const int* p,因?yàn)?const 和 * 都挨著,不管 const 在前還是在后,都是修飾 * 的。
好了,const這個"攔路虎"就這樣被我們輕松拿下了!是不是感覺豁然開朗?快去試試吧!