關於const的筆記

2021-04-03 02:43:33 字數 1419 閱讀 7516

今天讓指標常量,常量指標的說法搞糊塗了,原理明白,但是叫法上的區分糊塗呵呵!const是c特別是c++中經常遇到的東西,能靈活的運用可以體現你的cc++的水平。

1. 常量和預編譯

我們都知道在c中用到常量往往是通過預編譯來實現,但是這樣最大的缺點是不能夠進行型別檢查,使用const修飾變數就可以客服這樣的缺點。

常量在定義時必須初始化,除非它是extern

2. const與指標(重點)

一般來講我們可以定義5中型別的指標:

int  *pdata1;

const int *pdata2;

int *const pdata3;

const int * const pdata4;

int const * pdata5;

第乙個和第四個比較簡單:pdata1是普通的指標;pdata4是指向常量的指標常量:指向和指向的內容都不能改變。

對於1,3我們看const與*的位置:

如果const在*之前。那麼就是常量指標,否則就是指標常量,

如:char * const a = 0,b; 是指標常量,const只屬於a不屬於b

char const * a; 是常量指標

const char * a; 也是常量指標

我自己總結了這樣的記憶方法:前固數,後固址!就是說const在*前是固定資料,在後是固定位址。大家還可以看出 「數」正好在「址」的按照音序的前面,這樣理解記憶就好了。

通過上面的講解,我想大家見到以後肯定不會出錯了。但是怎樣區分這兩種說法呢?「常量指標」「指標常量」模擬是最好的方法我經常這樣用:「函式指標」「陣列指標」。「函式指標」是指向函式的指標,「陣列指標」是指向陣列的指標。那麼,「常量指標」是指向常量的指標,也就是內容「資料」不能改變。指標常量就是另外的一種意思。

最後需要注意的是:指標常量在定義時必須初始化,因為後面再也不能修改。

3. 常量和函式

常量和函式的聯姻還是出於效率的考慮。這也是const的最常用的用途之一。

3.1 const修飾函式的引數,引數傳遞時按值傳遞需要複製乙份,當資料量很大時,是很昂貴的。用了指標把位址傳過去就可以了。如果不想讓函式改變引數的的值的話就用const修飾。

void fun(const int *p);

3.2 const修飾函式的返回值,還是出於效率的考慮當函式返回時,也是需要臨時變數的,如果用指標(當最好是引用c++的新特性)就可以省去這樣的開銷。為了保證資料的安全性,返回的資料可能不想讓使用者隨便改動,那麼使用const : const char *getname();

3.3 在c++中修飾成員函式,防止改變物件的狀態(成員變數): char *player :: getname() const,const的成員函式不能夠呼叫非const的函式。那麼是不是const函式什麼都不能改呢?不是。c++中提供了mutable 關鍵字來修飾變數,使得它可以在任何的函式中可以修改。

關於const的筆記

今天讓指標常量,常量指標的說法搞糊塗了,原理明白,但是叫法上的區分糊塗呵呵!const是c特別是c 中經常遇到的東西,能靈活的運用可以體現你的cc 的水平。常量和預編譯 我們都知道在c中用到常量往往是通過預編譯來實現,但是這樣最大的缺點是不能夠進行型別檢查,使用const修飾變數就可以客服這樣的缺點...

筆記 關於const和volatile

關於這方面的內容,我自己經驗不夠說得不夠清楚。但又想記錄下來,於是上網找了的提問。問題帖子 1.volatile volatile標識乙個變數意味著這個變數可能被非本程式的其他過程改變,例如某個訪問這一變數的某中斷程式。為變數加上這一標識可以禁止編譯器的優化,使程式正確地按設計者的意圖執行。例如下面...

關於const的總結

const int a const integer int const a const integer int const a integer poiter to const integer int const a const integer poiter to integer int a cons...