一些成員函數(shù)改變對(duì)象的數(shù)據(jù)成員值,一些成員函數(shù)不改變對(duì)象得數(shù)據(jù)成員值。 例如: int Point::GetY() { return yVal; } 這個(gè)函數(shù)被調(diào)用時(shí),不改變Point對(duì)象數(shù)據(jù)成員值,而下面的成員函數(shù)改變Point對(duì)象的數(shù)據(jù)成員值: 例如: void Point:: SetPt (int x, int y) { xVal=x; yVal=y; }
為了使成員函數(shù)的意義更加清楚,我們可在不改變對(duì)象的成員函數(shù)的函數(shù)原型中加上const說(shuō)明,(實(shí)際上,任何任何不修改成員數(shù)據(jù)的函數(shù)都應(yīng)該聲明為const函數(shù),這樣有助于提高程序的可讀性和可靠性。class Point { public: int GetX() const; int GetY() const; void SetPt (int, int); void OffsetPt (int, int); PRivate: int xVal, yVal; }; const成員函數(shù)應(yīng)該在函數(shù)原型說(shuō)明和函數(shù)定義中都增加const限定: int Point::GetY() const { return yVal; }
class Set { public: Set (void){ card = 0; } bool Member(const int) const; void AddElem(const int); //… }; bool Set::Member (const int elem) const { //… }
非常量成員函數(shù)不能被常量成員對(duì)象調(diào)用,因?yàn)樗赡芷髨D修改常量的數(shù)據(jù)成員: const Set s; s.AddElem(10); // 非法: AddElem不是常量成員函數(shù) s.Member(10); // 正確
但構(gòu)造函數(shù)和析構(gòu)函數(shù)對(duì)這個(gè)規(guī)則例外,它們從不定義為常量成員,但可被常量對(duì)象調(diào)用(被自動(dòng)調(diào)用)。它們也能給常量的數(shù)據(jù)成員賦值,除非數(shù)據(jù)成員本身是常量。
為什么需要const成員函數(shù)? 我們定義的類的成員函數(shù)中,常常有一些成員函數(shù)不改變類的數(shù)據(jù)成員,也就是說(shuō),這些函數(shù)是”只讀”函數(shù),而有一些函數(shù)要修改類數(shù)據(jù)成員的值。如果把不改 變數(shù)據(jù)成員的函數(shù)都加上const關(guān)鍵字進(jìn)行標(biāo)識(shí),顯然,可提高程序的可讀性。其實(shí),它還能提高程序的可靠性,已定義成const的成員函數(shù),一旦企圖修 改數(shù)據(jù)成員的值,則編譯器按錯(cuò)誤處理。
const成員函數(shù)和const對(duì)象 實(shí)際上,const成員函數(shù)還有另外一項(xiàng)作用,即常量對(duì)象相關(guān)。對(duì)于內(nèi)置的數(shù)據(jù)類型,我們可以定義它們的常量,用戶自定義的類也一樣,可以定義它們的常量對(duì)象。例如,定義一個(gè)整型常量的方法為:
const int i=1 ; 同樣,也可以定義常量對(duì)象,假定有一個(gè)類classA,定義該類的常量對(duì)象的方法為: const classA a(2); 這里,a是類classA的一個(gè)const對(duì)象,”2”傳給它的構(gòu)造函數(shù)參數(shù)。const對(duì)象的數(shù)據(jù)成員在對(duì)象壽命期內(nèi)不能改變。但是,如何保證該類的數(shù)據(jù)成員不被改變呢? 為了確保const對(duì)象的數(shù)據(jù)成員不會(huì)被改變,在C++中,const對(duì)象只能調(diào)用const成員函數(shù)。如果一個(gè)成員函數(shù)實(shí)際上沒(méi)有對(duì)數(shù)據(jù)成員作任何形式的修改,但是它沒(méi)有被const關(guān)鍵字限定的,也不能被常量對(duì)象調(diào)用。下面通過(guò)一個(gè)例子來(lái)說(shuō)明這個(gè)問(wèn)題:
class C { int X; public: int GetX() { return X; } void SetX(int X) { this->X = X; } }; void main() { const C constC; cout<
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注