Posted on 2008-09-04 19:02
阿呆@Rachel 閱讀(1444)
評論(4) 編輯 收藏 引用 所屬分類:
C++
const是C++的關(guān)鍵字之一,與其他的關(guān)鍵字相比,C++初學(xué)者可能對于const的使用會一時摸不著頭腦,若能正確的使用const,將使你的程序更加Robust!
測試題先行~~
1 int i = 5;
2 const int *ip = &i;
3 int const *ip = &i;
4 int* const ip = &i;
5 const int* const ip = &i;
對于上面四個條語句,你能說出它們之間的區(qū)別嗎?
2)和3)中const修飾的是*ip, 這表明ip所指向的變量i是const的,類似*ip = 1的操作編譯的時候都會報(bào)錯;4)const修飾的是ip,說明指針本身是const,修改指針指向的變量是合法的,而類似++ip修改指針本身的操作是違法的;5)指針本身和指向的變量都是const的。
const的用法主要體現(xiàn)在函數(shù)聲明中的應(yīng)用,它既可以修飾函數(shù)參數(shù),還可以修飾函數(shù)的返回值,此外對于類的成員函數(shù),它還可以修飾整個函數(shù)。下面是一個簡單簡單的二維向量類:
class Vector2D{
float x, y;
public:
Vector2D( float _x = 0, float _y = 0 ) : x( _x ), y( _y )
{}
Vector2D( const Vector2D &vec ) : x( vec.x ), y( vec.y ) // 修飾參數(shù)
{}
float GetX() const { return x; } // 修飾整個函數(shù)
const Vector2D operator + ( const Vector2D &rval ) const // 修飾參數(shù),返回值和整個函數(shù)
{ return Vector2D( x + rval.x, y + rval.y ); }
};
--const修飾函數(shù)參數(shù)
在copy構(gòu)造函數(shù)中,const修飾的是函數(shù)的參數(shù),調(diào)用函數(shù)的時候,用相應(yīng)的變量初始化const常量,則在函數(shù)體中,按照const所修飾的部分進(jìn)行常量化,如形參為const Vector2D &vec,則不能對傳遞進(jìn)來的引用對象的進(jìn)行改變,從而保護(hù)了原對象的屬性。
[Tips]const通常用于修飾指針或引用類型的參數(shù)。
--const修飾返回值
在重載的向量加法運(yùn)算符的函數(shù)中,返回值用const修飾,這樣如下的賦值操作就非法的:
Vector2D vec1, vec2, vec3;
(vec1+vec2) = vec3;
[Tips]一般情況下,函數(shù)的返回值為某個對象時,如果將其聲明為const時,多用于運(yùn)算符的重載。通常,函數(shù)返回值為某個對象或?qū)ο蟮囊脮r,不用const來修飾。因?yàn)椋@樣返回的實(shí)例只能訪問public成員和const成員函數(shù),并且賦值操作也是非法的,這樣的用法是非常罕見的。
--const修飾類的成員函數(shù)
對于Vector2D::GetX()函數(shù),因?yàn)樗粫薷某蓡T數(shù)據(jù),若聲明成const,如果函數(shù)實(shí)現(xiàn)中修改了成員變量,編譯的時候?qū)?bào)錯,這樣程序會更加的Robust~~
[Tips]
a.在你搞清楚const的用法之后,請大膽使用;
b.在參數(shù)中使用const應(yīng)該使用引用或指針,而不是一般的對象實(shí)例;
c.不要輕易的將函數(shù)的返回值類型定為const;
d.除了重載操作符外一般不要將返回值類型定為對某個對象的const引用。