const基礎用法

2021-05-18 11:19:23 字數 3221 閱讀 4225

一 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...