一 const基礎
如果const關鍵字不涉及到指標,我們很好理解,下面是涉及到指標的情況:
int b = 500;
const int* a = &b; [1]
int const *a = &b; [2]
int* const a = &b; [3]
const int* const a = &b; [4]
如果你能區分出上述四種情況,那麼,恭喜你,你已經邁出了可喜的一步。不知道,也沒關係,我們可以參考《effective c++》item21上的做法,
如果const位於星號的左側,則const就是用來修飾指標所指向的變數,即指標指向為常量;
如果const位於星號的右側,const就是修飾指標本身,即指標本身是常量。
因此,[1]和[2]的情況相同,都是指標所指向的內容為常量(const放在變數宣告符的位置無關),這種情況下不允許對內容進行更改操作,如不能*a = 3 ;
[3]為指標本身是常量,而指標所指向的內容不是常量,這種情況下不能對指標本身進行更改操作,如a++是錯誤的;
[4]為指標本身和指向的內容均為常量。
二 作為引數
void display(const double& r);或者void display(const double* r);
說明:1 在引用或者指標引數的時候使用const限制是有意義的,而對於值傳遞的引數使用const則沒有意義
2 保證引用的變數的值不被改變
3 const在double前或者後面意思相同,只是不同的人的寫法不同
三 const物件
宣告為const的物件只能訪問類中宣告為const的成員函式,不能呼叫其它成員函式.
四 const成員函式
型別說明符 函式名(參數列)const; void print(int i) const;
說明:1 const是函式型別的乙個組成部分,因此在實現部分也要帶const關鍵字.
2 常成員函式不能更新物件的資料成員,也不能呼叫該類中沒有用const修飾的成員函式.
五 使用const的一些建議
1 要大膽的使用const,這將給你帶來無盡的益處,但前提是你必須搞清楚原委;
2 要避免最一般的賦值操作錯誤,如將const變數賦值,具體可見思考題;
3 在引數中使用const應該使用引用或指標,而不是一般的物件例項,原因同上;
4 const在成員函式中的三種用法(引數、返回值、函式)要很好的使用;
5 不要輕易的將函式的返回值型別定為const;
6除了過載操作符外一般不要將返回值型別定為對某個物件的const引用;
const int max_length = 100;
編譯器就可以看到max_length這個符號,並且可以對max_length進行型別檢查,在**發生錯誤時也能正確地報出錯誤位置。
1.2在團隊開發中有用,比如你寫乙個函式計算字串的長度,原型寫成int mystrlen(const char * str),則表示這個函式並不會改變str所指向的內容(即*str).這樣使用起來更加安全,該const限制能保證團隊的開發人員按正確的方式使用已有**。
int const number = 1;
//同上,可見const 放在int 前面或後面的意義是一樣的
int const *p;
//同上,可見const 放在int 前面或後面的意義是一樣的
const int *p;int* const p = &number1;const int * const p = &number;
int & number2 = number;
這個其實很容易記的,主要是看const修飾的是誰
class example
;
上述**雖然能通過編譯,但存在一下悖論,max_length既然是乙個常量,那麼它一定不會改變,按照上面的**,類的每乙個物件(也稱例項)中都會有乙份max_length的copy,這不是在白白浪費記憶體?所以通常類中的常量應當定義為乙個靜態變數,標準的**如下
class example
;const int example::max_length = 100;//static 的常量不能在類中定義
public:
int getlength();//獲得串的長度
void setlength(int len);//設定長度
//......
};///getlength的實現
int mystring::getlength()
///setlength的實現
void mystring::setlength(int len)
類的成員函式(內聯除外)是另外安排空間的,並不放在類的裡面,類的各個物件呼叫的都是外部的同乙個函式.如:
mystring s1;
mystring s2;
s1.setlength(1);
s2.setlength(2);getlength(mystring const * const this)
ps:前幾天趨勢公司考過,怕大家以後筆試遇到,於是就帖出來了
bool copystring(mystring & szdest,const mystring & szstr)
如果getlength不是const型,則不能編譯通過,解釋如下
copystring的第二個引數 const mystring & szstr表明szstr是乙個const引用,當szstr.getlength()時傳遞給getlength的第乙個引數是szstr 的型別是mystring const *const szstr,
而未經const修飾的getlength接受的第乙個引數是mystring * const this,兩者不匹配編譯出錯
如果用const修飾getlength則getlength的第乙個引數是mystring const * const this 與szstr匹配,編譯通過
C 基礎之const基礎用法
前世 下列 for 迴圈語句有兩個問題,兩個都和使用 512 作為迴圈上界有關。for int index 0 index 512 index 第乙個問題是程式的可讀性。比較 index 與 512 有什麼意思呢?迴圈在做什麼呢?也就是說 512 作用何在?第二個問題是程式的可維護性。假設這個程式非...
C 基礎 const基本用法
c 中三目運算子可以當左值 a b a b 30 返回乙個最小數 並且給最小數賦值成30const的基本用法 int main int func1 const 初級理解 const是定義常量 const意味著唯讀 含義 第乙個第二個意思一樣 代表乙個常整形數 第三個 c是乙個指向常整形數的指標 所指...
5 const的基礎用法
在c語言中,const可以認為是乙個假的關鍵字,即使用了const來定義,但是也是可以通過指標來修改其值 但是在c 中,用了const之後,就不能對值進行修改。const修飾的可以有以下幾種情況 include using namespace std 0 const的基礎知識 struct teac...