const成員函式使用問題

2021-04-27 01:06:07 字數 2011 閱讀 8399

任何不會修改資料成員的函式都應該宣告為const型別.如果在編寫const成員函式時,不慎修改了資料成員,或者呼叫了其它非const成員函式,編譯器將指出錯誤,這無疑會提高程式的健壯性

以下程式中,類stack的成員函式getcount僅用於計數,從邏輯上講getcount應當為const函式.編譯器將指出getcount函式中的錯誤

const成員函式的宣告看起來怪怪的:const關鍵字只能放在函式宣告的尾部,大概是因為其它地方都已經被占用了

原帖請見 http://www.chinaunix.net/forum/viewtopic.php?t=143183

樓主的這篇文章值得仔細閱讀。但是,我覺得上述「const 限定類的成員函式」這一部分寫得比較簡略,特別是其中「注意」後面的文字,更是使人不知所云,所以想對這一部分做一些補充說明。

類的成員函式後面加 const,表明這個函式不會對這個類物件的資料成員(準確地說是非靜態資料成員)作任何改變。

在設計類的時候,乙個原則就是對於不改變資料成員的成員函式都要在後面加 const,而對於改變資料成員的成員函式不能加 const。所以 const 關鍵字對成員函式的行為作了更加明確的限定:有 const 修飾的成員函式(指 const 放在函式引數表的後面,而不是在函式前面或者參數列內),只能讀取資料成員,不能改變資料成員;沒有 const 修飾的成員函式,對資料成員則是可讀可寫的。

除此之外,在類的成員函式後面加 const 還有什麼好處呢?樓主告訴我們的:「獲得能力:可以操作常量物件」,其實應該是常量(即 const)物件可以呼叫 const 成員函式,而不能呼叫非const修飾的函式。正如非const型別的資料可以給const型別的變數賦值一樣,反之則不成立。

對於const成員函式,"不能修改類的資料成員,不能在函式中呼叫其他不是const的函式",這是由const的屬性決定的,樓主說得完全正確。

請看下面乙個完整的例子,然後我再作一些說明。

設計了乙個類 student,資料成員有 name 和 score,有兩個建構函式,有乙個設定成員資料函式 set_student(),各有乙個取得 name 和 score 的函式 get_name() 和 get_score()。請注意 get_name() 和 get_score() 後面都加了 const,而 set_student() 後面沒有(也不能有const)。

首先說一點題外話,為什麼 get_name() 前面也加 const。如果沒有前後兩個 const 的話,get_name() 返回的是對私有資料成員 name 的引用,所以通過這個引用可以改變私有成員 name 的值,如

即把 name 由原來的 "wang" 變成了 "li",而這不是我們希望的發生的。所以在 get_name() 前面加 const 避免這種情況的發生。

那麼,get_name() 和 get_score() 這兩個後面應該加 const的成員函式,如果沒有 const 修飾的話可不可以呢?回答是可以!但是這樣做的代價是:const物件將不能再呼叫這兩個非const成員函式了。如

const string& get_name(); // 這兩個函式都應該設成 const 型

int get_score();

void output_student( const student& student )

由於引數student表示的是乙個對const student型物件的引用,所以 student 不能呼叫非const成員函式如 set_student()。如果 get_name() 和 get_score() 成員函式也變成非const型,那麼上面的 student.get_name() 和 student.get_score() 的使用就是非法的,這樣就會給我們處理問題造成困難。

因此,我們沒有理由反對使用const,該加const時就應該加上const,這樣使成員函式除了非const的物件之外,const物件也能夠呼叫它。

const成員函式

prime c 在類sales item中,same isbn函式定義如下 bool sales item same isbn const sales item rhs const const 成員函式的引入 跟在 sales item 成員函式宣告的形參表後面的 const 所起的作用了 cons...

const成員函式

我們知道,在c 中,若乙個變數宣告為const型別,則試圖修改該變數的值的操作都被視編譯錯誤。例如,cpp view plain copy const char blank blank n 錯誤 物件導向程式設計中,為了體現封裝性,通常不允許直接修改類物件的資料成員。若要修改類物件,應呼叫公有成員函...

const成員函式

一.關於const成員函式的呼叫 const物件只能呼叫const成員函式 cpp view plain copy include using namespace std class a void fun intmain 輸出 const 成員函式 但是如果把第以1個fun注釋掉就會出錯 error...