const用法的解惑

   雖然看過C++方面不少的資料,但我現在仍然是一個初學者,編過C++的一些程序,但不多。const修飾詞做爲C++一個重要的概念,務必要弄清楚才行,看到網上一個C++學習者的博客上歸納的很不錯,很精煉。以下是參考的鏈結:

htmlhttp://www.cppblog.com/seuauto/archive/2008/09/04/60941.html

const是C++的關鍵字之一,與其他的關鍵字相比,C++初學者可能對於const的使用會一時摸不着頭腦,若能正確的使用const,將使你的程序更加Robust!

先看下面的一些代碼:

 

 int i = 5;
 
const int *ip = &i;
 
int const *ip = &i;
 
int* const ip = &i;
 
const int* const ip = &i; 

   對於上面四個條語句,你能說出它們之間的區別嗎?
2)和3)中const修飾的是*ip, 這表明ip所指向的變量i是const的,類似*ip = 1的操作編譯的時候都會報錯;4)const修飾的是ip,說明指針本身是const,修改指針指向的變量是合法的,而類似++ip修改指針本身的操作是違法的;5)指針本身和指向的變量都是const的。

const的用法主要體現在函數聲明中的應用,它既可以修飾函數參數,還可以修飾函數的返回值,此外對於類的成員函數,它還可以修飾整個函數。下面是一個簡單簡單的二維向量類:

 


 1class Vector2D{
 2    float x, y;
 3public:
 4    Vector2D( float _x = 0float _y = 0 ) : x( _x ), y( _y )
 5    {}
 6    Vector2D( const Vector2D &vec ) : x( vec.x ), y( vec.y )  // 修飾參數
 7    {} 
 8    float GetX() const return x; }     // 修飾整個函數     
 9    const Vector2D operator + ( const Vector2D &rval ) const  // 修飾參數,返回值和整個函數
10    return Vector2D( x + rval.x, y + rval.y );   }   
11}
;
12

 

 

 --const修飾函數參數
在copy構造函數中,const修飾的是函數的參數,調用函數的時候,用相應的變量初始化const常量,則在函數體中,按照const所修飾的部分進行常量化,如形參爲const Vector2D &vec,則不能對傳遞進來的引用對象的進行改變,從而保護了原對象的屬性。
[Tips]const通常用於修飾指針或引用類型的參數。

--const修飾返回值
在重載的向量加法運算符的函數中,返回值用const修飾,這樣如下的賦值操作就非法的:
Vector2D vec1, vec2, vec3;
(vec1+vec2) = vec3;
[Tips]一般情況下,函數的返回值爲某個對象時,如果將其聲明爲const時,多用於運算符的重載。通常,函數返回值爲某個對象或對象的引用時,不用const來修飾。因爲,這樣返回的實例只能訪問public成員和const成員函數,並且賦值操作也是非法的,這樣的用法是非常罕見的。

--const修飾類的成員函數
對於Vector2D::GetX()函數,因爲它不會修改成員數據,若聲明成const,如果函數實現中修改了成員變量,編譯的時候將報錯,這樣程序會更加的Robust。

[Tips]
a.在你搞清楚const的用法之後,請大膽使用;
b.在參數中使用const應該使用引用或指針,而不是一般的對象實例;
c.不要輕易的將函數的返回值類型定爲const;
d.除了重載操作符外一般不要將返回值類型定爲對某個對象的const引用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章