1不再使用c中的#define,c++預設不給const定義的變數分配記憶體,所以它預設的是僅本檔案可以看到該變數(即internal linkage),
const int bufisze;如果工程中的檔案看見,就要明顯的寫出關鍵字extern,即,此時編譯器會給它分配記憶體。
extern const int bufisze = 100;另外:
externconst
int bufsize;//
只是宣告不是定義
const
int bufsize=10;//
必須加上如此定義
//int bufsize=1;!error
//bufsize=1;erro
const buf;//
錯誤,因為預設的只有內部檔案可見,必須定義的時候就初始化。
表示該引數不能改變。
void f(constinti)
在使用某些類,特別是比較大的類的時候,我們經常看到引數的形式如 fun(const integer & a),(integer 是某個自定義類)使用引用和const。我對此的理解是:
1 」引用引數」的效率優於「傳值引數」。傳值呼叫引數是乙個區域性變數,會被初始化為相同的引數值,那麼呼叫函式時候會存在兩個副本,而引用相當於直接用了那個位址的引數。(所以函式中若改變了引用的引數,結果會保留)
2我們既不想創造兩個副本,所以用「引用&」,不要確定該類的引數沒有被改變,所以經常我們會看到這種語法,
const integer & a,既提高效率,又確定不改變類a
主要針對,返回值為自定義的類,對於built-in type(如int,double),加不加無所謂。
const x f6();
f6()=x(1)//error
其目的就是為了實現使用者自定義型別與內建型別最大限度的保持一致性。
比如操作 a+b = c; 對於內建型別在編譯時,會彈出不能對lvalue進行賦值的錯誤;然而對於使用者自定義型別,比如class a{}; 當對a定義了形式為
a operator+(const a& lhs, const a& rhs){};的介面時,編譯和連線過程不會出現內建型別彈出的錯誤。
解決辦法就是給函式的返回值加上const標識,指定不能對函式的返回值進行賦值,如此一來,對於自定義型別,再進行a+b = c;操作時,編譯過程也會報錯。
在現實的編碼中,可能誰也不會敲出a+b=c;這樣的單純語句,但是你不可能保證在你想表達if(a+b == c)時,卻一時馬虎寫成了if(a+b = c),程式能夠編譯連線通過,但不是按你想要的邏輯執行,於是問題就出現了,這個問題應該再編譯時期就被發現的
//此段參考
如
void ouput() const;該類的const物件,只能呼叫const成員函式,不能呼叫非const成員函式。
c const關鍵字 總結
在全域性作用於里定義非const變數時,在整個程式中都可以訪問.除非特別說明,在全域性作用於的宣告的const變數時定義該物件的檔案的區域性變數.死變數只存在與那個檔案中,不能被其他檔案訪問.非const變數預設為extern.要使const變數能夠在其他地方的檔案中訪問,必須顯示指定為extern...
c const關鍵字詳解
正所謂酒足思淫慾,當衣食無憂的時候自然會產生很多的歪想法,就像當官一樣,權力越大,越容易腐敗。effective c 中第三條 盡量使用const。這就說明使用const是有很大的好處的,const就是把權力盡可能控制一下,這樣就會減免很多出bug的機會。因為乙個專案不可能只有乙個人開發,即使是乙個...
c const關鍵字總結
const int max size 1024 這是最常見的用法,大家都沒問題,const在定義的時候需要初始化。有兩點需要注意一下 a const變數預設是區域性變數,如果需要全域性訪問,需要顯示地extern b const int max size 1024 與 define max size...