C const成員函式

2021-07-22 11:15:56 字數 1673 閱讀 6730

原文://

我們知道,在c++中,若乙個變數宣告為const型別,則試圖修改該變數的值的操作都被視編譯錯誤。例如,

const

char blank = 『』;

blank = 『\n』; // 錯誤

物件導向程式設計中,為了體現封裝性,通常不允許直接修改類物件的資料成員。若要修改類物件,應呼叫公有成員函式來完成。為了保證const物件的常量性,編譯器須區分不安全與安全的成員函式(即區分試圖修改類物件與不修改類物件的函式)。例如,

const screen blankscreen;  

blankscreen.display(); // 物件的讀操作

blankscreen.set(『*』); // 錯誤:const類物件不允許修改

在c++中,只有被宣告為const的成員函式才能被乙個const類物件呼叫。

要宣告乙個const型別的類成員函式,只需要在成員函式引數列表後加上關鍵字const,例如,

class

screen ;

在類體之外定義const成員函式時,還必須加上const關鍵字,例如
char screen::get() const
若將成員成員函式宣告為const,則該函式不允許修改類的資料成員。例如,
class screen   

int error(intival) const

};

在上面成員函式的定義中,ok()的定義是合法的,error()的定義則非法。

值得注意的是,把乙個成員函式宣告為const可以保證這個成員函式不修改資料成員,但是,如果據成員是指標,則const成員函式並不能保證不修改指標指向的物件,編譯器不會把這種修改檢測為錯誤。例如,

class name ;  

void setname(const

string &s) const

雖然m_name不能被修改,但m_sname是char *型別,const成員函式可以修改其所指向的字元。

const成員函式可以被具有相同引數列表的非const成員函式過載,例如,

class

screen ;

在這種情況下,類物件的常量性決定呼叫哪個函式。

const screen cs;  

screen cc2;

char ch = cs.get(0, 0); // 呼叫const成員函式

ch = cs2.get(0, 0); // 呼叫非const成員函式

小結:

1)const成員函式可以訪問非const物件的非const資料成員、const資料成員,也可以訪問const物件內的所有資料成員;

2)非const成員函式可以訪問非const物件的非const資料成員、const資料成員,但不可以訪問const物件的任意資料成員;

3)作為一種良好的程式設計風格,在宣告乙個成員函式時,若該成員函式並不對資料成員進行修改操作,應盡可能將該成員函式宣告為const 成員函式。

c const成員函式

一些成員函式改變物件,一些成員函式不改變物件。例如 int point gety 這個函式被呼叫時,不改變point物件,而下面的函式改變point物件 void point setpt int x,int y 為了使成員函式的意義更加清楚,我們可在不改變物件的成員函式的函式原型中加上const說明...

C const 成員函式

const 常 成員函式是一種獲取物件狀態的成員函式,並且不能改變物件的狀態 也就是不能修改物件的成員的值 宣告和定義如下 classa a void func const 問題一 如果有兩個同名函式,只是其中乙個是常成員函式,這樣的寫法有錯嗎?class a 編譯器並沒有報錯!問題二 形參列表應該...

C const成員函式

const可以用於替換 define 使用巨集定義可能並不會加入記號表 symbol table 例如 define pi 3.14159 const double pi 3.14159 而對於const與指標同時出現的情況 如果const在 左側,則被指物為常量 如果const在 右側,則指標本身...