📢博客主頁: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 成員函數
};
規則如下
- const 對象只能訪問const 成員函數,非const 的對象可以訪問任何成員函數,包括const 成員函數。
- 如果函數名、參數、返回值都相同的const成員函數和非const成員函數是可以構成重載,那么const對象調用const成員函數,非const對象默認調用非const的成員函數。
- const成員函數可以訪問所有成員變量,但是只能訪問const的成員函數。
- 非const成員函數,可以訪問任何成員,包括const成員成員函數。
- onst成員函數不能修改任何的成員變量,除非變量用mutable修飾。
🏳??🌈使用const的好處
可以定義const常量
這樣可以避免由于無意間修改數據而導致的編程錯誤,提供了一個保護作用。
便于進行類型檢查
const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查,而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換時可能會產生意料不到的錯誤。
為函數重載提供了一個參考
const修飾的函數可以看作是對同名函數的重載。
可以節省空間,避免不必要的內存分配
const定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是象宏一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而宏定義的常量在內存中有若干個拷貝。
提高了效率
編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。
🏳??🌈const在C和C++中的區別
-
在C語言中,用const修飾的變量,其
本質上還是個變量
,只是它不允許作為左值存在,也就是不法對該變量進行直接賦值修改該變量,但是這不意味著該變量的值就無法修改。 -
在C++中 ,在編譯的時候,當碰到用const修飾的變量時,編譯器是直接
將變量的值和變量的符號對應起來一起存到符號表
。 -
例如const int a = 5;在符號表中就會將a和5對應起來,在編譯的過程中,當碰到printf(“a = %d\n”,a); 時,用 5 直接將 a 替換掉。在C++中,編譯器不會為a分配存儲空間,在C語言中就會為a分配存儲空間,所以在C編譯器中,就
可以通過指針來改變用const修飾的變量
。 -
其實在C++中,const修飾的變量,在編譯的時候如果前面有extern和取地址符 & 時,會為變量分配存儲空間是為了兼容C語言,但是在C++中,
用const修飾的變量就真的無法修改它的值
,可以說是常量。但是在C語言中,const修飾的變量本質上還是變量而不是常量。這在C語言中其實也是矛盾的,因為我們想要用const定義一個常量,但又可以通過指針來改變該常量的值。而C++為了兼容C語言,所以保留了這個特性,但是卻無法修改它的值,這就是const在C語言和C++中的區別。
本篇博文對 const 做了一個較為詳細的介紹,不知道對你有沒有幫助呢
覺得博主寫得還不錯的三連支持下吧!會繼續努力的~