1. 程式人生 > >const的用法之與函數的關系

const的用法之與函數的關系

public 函數 urn 原型 實現 highlight gety mem 自定義

第一次接觸const的用法大概就是知道是個聲明為常量不允許改變的意思,最常用的是可以像這樣定義:

const int max=100;

用來代替據說有害的define宏定義,但是有時候會看到const出現在函數名和函數體中間,作用是什麽呢?查了下,如下:

  一些成員函數改變對象,一些成員函數不改變對象,比如:

int Point::GetY()
{
  return yVal; }

這個函數被調用時候不改變原函數的值,而下面函數:

void Point::SetPt(int x,int y)
{
  xVal=x;
  yVal=y;
}

會改變Point對象,為了使成員函數的意義更加明確,可以在不改變對象的成員函數的函數原型中加上const,如下:

1 class Point
{
  public:
    int GetX() const;
    int Gety() const;
    void SetPt(int,int);
   private:
    int xVal,yVal;
};

註意:const成員函數應該在函數原型和函數定義中都增加const限定。

關鍵字 const 必須用同樣的方式重復出現在函數實現裏,否則編譯器會把
它看成一個不同的函數。

非常量成員函數不能被常量成員對象調用,因為它可能企圖修改常量的數
據成員:

const Set s;
s.AddElem(10); // 非法: AddElem 不是常量成員函數
s.Member(10
); // 正確

但構造函數和析構函數對這個規則例外,它們從不定義為常量成員,但可
被常量對象調用(被自動調用)。它們也能給常量的數據成員賦值,除非數據
成員本身是常量。

----------------------------

為什麽需要 const 成員函數?
我們定義的類的成員函數中,常常有一些成員函數不改變類的數據成員,
也就是說,這些函數是"只讀"函數,而有一些函數要修改類數據成員的值。如
果把不改變數據成員的函數都加上 const 關鍵字進行標識,顯然,可提高程序
的可讀性。其實,它還能提高程序的可靠性,已定義成 const 的成員函數,一
旦企圖修改數據成員的值,則編譯器按錯誤處理。
const 成員函數和 const 對象
實際上,const 成員函數還有另外一項作用,即常量對象相關。對於內置
的數據類型,我們可以定義它們的常量,用戶自定義的類也一樣,可以定義它
們的常量對象。例如,定義一個整型常量的方法為:
const int i=1 ;
同樣,也可以定義常量對象,假定有一個類 classA,定義該類的常量對象的方
法為:
const classA a(2);
這裏, a 是類 classA 的一個 const 對象, "2"傳給它的構造函數參數。 const
對象的數據成員在對象壽命期內不能改變。但是,如何保證該類的數據成員不
被改變呢?
為了確保 const 對象的數據成員不會被改變,在 C++中,const 對象只能調
用 const 成員函數。如果一個成員函數實際上沒有對數據成員作任何形式的修
改,但是它沒有被 const 關鍵字限定的,也不能被常量對象調用。

-----

c++邊學邊用,難精通易使用,前路且長。

const的用法之與函數的關系