const深度總結(effective C )

2021-08-08 11:21:34 字數 2920 閱讀 1372

如果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]的情況相同,都是指標所指向的內容為常量,這種情況下不允許對內容進行更改操 作,如不能*a= 3;

[3]為指標本身是常量,而指標所指向的內容不是常量,這種情況下不能對指標本身進行更改操作,如a++是錯誤的;

[4]為指標本身和指向的內容均為常

量。   

另外const的一些強大的功能在於它在函式宣告中的應用。在乙個函式宣告中,const 可以修飾函式的返回值,或某個引數;對於成員函式,還可以修飾是整個函式。有如下幾種情況,以下會逐漸的說明用法:

a& operator=(const a& ,a);   

void fun0(const a*,a);

void fun1() const; //fun1() 為類成員函式

const a fun2();

先看一下const變數初始化的情況(a表示型別)

1)   非指標const常量初始化的情況:c   b;   

const   c   =   b;   

2)   指標(引用)const常量初始化的情況:*   d   =   new   a();   

const   *   c   =   d;   

或者:const   a*   c   =   new   a();   

引用:   

f;   

const   &   e   =   f;   //   這樣作e只能訪問宣告為const的函式,而不能訪問一般的成員函式;   

其實,不論是引數還是返回值,道理都是一樣的,引數傳入時候和函式返回的時候,初始化const變數.   

1.修飾引數的const:

如   void   fun0(const   a*, a   );   void   fun1(const   a& ,a);   

呼叫函式的時候,用相應的變數初始化const常量,則在函式體中,按照const所修飾的部分進行常量化,如形參為const   a*, a,則不能對傳遞進來的指標的內容進行改變,保護了原指標所指向的內容;如形參為const   a&   a,則不能對傳遞進來的引用物件進行改變,保護了原物件的屬性。

[注意]:引數const通常用於引數為指標或引用的情況;   

2.修飾返回值的const

如const   a   fun2();   const   a*   fun3();   

這樣宣告了返回值後,const按照"修飾原則"進行修飾,起到相應的保護作用

const   rational   operator*(const   rational&   lhs,   const   rational&   rhs)   

返回值用const修飾可以防止允許這樣的操作發生:rational   a,b;  

一般用const修飾返回值為物件本身的情況多用於二目操作符過載函式並產生新物件的時候。   

[總結]  

一般情況下,函式的返回值為某個物件時,如果將其宣告為const時,多用於操作符的過載。通常,不建議用const修飾函式的返回值型別為某個物件或對某個物件引用的情況。   

[原因如下]   

如果返回值為某個物件為const或某個物件的引用為const   ,則返回值具有const屬性,則返回例項只能訪問類a中的公有資料成員和const成員函式,並且不允許對其進行賦值操作,這在一般情況下很少用 到。

一般放在函式體後,形如:void   fun()   const;   

如果乙個成員函式不會修改資料成員,那麼最好將其宣告為const,因為const成員函式中不允許對資料成員進行修改,如果修改,編譯器將報錯,這大 大提高了程式的健壯性。

1   要大膽的使用const,這將給你帶來無盡的益處,但前提是你必須搞清楚原委;   

2   要避免最一般的賦值操作錯誤,如將const變數賦值;   

3   在引數中使用const應該使用引用或指標,而不是一般的物件例項,原因同上;   

4   const在成員函式中的三種用法要很好的使用;   

5   不要輕易的將函式的返回值型別定為const;

6   除了過載操作符外一般不要將返回值型別定為對某個物件的const引用; 

effective c++

Const 深度解析

物件導向是c 的重要特性.但是c 在c的基礎上新增加的幾點優化也是很耀眼的 就const直接可以取代c中的 define 以下幾點很重要,學不好後果也也很嚴重 1.const常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安...

const 學習總結

以前也有學過 const 對它了解 歸根結底只是了解 用法只限於簡單的使用沒有乙個深入的理解,用法1 代替巨集和常量 define max 1000 沒有了解 const之前 const int max 1000 有了const之後 用法2 引數 myfun string str1 以前的寫法 my...

const用法總結

1.const 一 對於基本宣告 const int r 100 標準const變數宣告加初始化,編譯器經過型別檢查後直接用100在 編譯時替換 二 對於指標 1.int x 10 const int r x 指標 指向的內容是常量 r指向的內容不能夠通過r改變,但如果指向的內容是非const 例如...