在下面的**中a1呼叫const版本,a2呼叫非const版本。const a a1;
a a2;
a1.x();
a2.x();
後面加const表示在該函式中不能對類的資料成員進行改變,比如:
class a
//這可以
int x() const
};當然有特殊情況,就是用mutable關鍵字修飾過的成員變數可以在宣告為const 函式中被改變。
關於mutable:
關鍵字mutable是c++中乙個不常用的關鍵字,他只能用於類的非靜態和非常量資料成員
我們知道乙個物件的狀態由該物件的非靜態資料成員決定,所以隨著資料成員的改變,
對像的狀態也會隨之發生變化!
如果乙個類的成員函式被宣告為const型別,表示該函式不會改變物件的狀態,也就是
該函式不會修改類的非靜態資料成員.但是有些時候需要在該類函式中對類的資料成員
進行賦值.這個時候就需要用到mutable關鍵字了
例如:class demo
~demo(){}
public:
bool getflag() const
private:
int m_naccess;
bool m_bflag;
}; int main()
編譯上面的**會出現 error c2166: l-value specifies const object的錯誤
說明在const型別的函式中改變了類的非靜態資料成員.
這個時候需要使用mutable來修飾一下要在const成員函式中改變的非靜態資料成員
m_naccess,**如下:
class demo
~demo(){}
public:
bool getflag() const
private:
mutable int m_naccess;
bool m_bflag;
}; int main()
這樣再重新編譯的時候就不會出現錯誤了!
char& operator(int posion) // function_1;注意,這裡該函式的返回值為乙個引用,否則str[0] = 'c'這樣的語句就會不合法,因為str[0]將是乙個左值。那麼,是否提供這樣乙個function_1就足夠了呢?看下面這段**:
const string str= "she";
很顯然,我們必須還要為const string提供乙個const版本的opeartor。如下:
char& operator(int posion)const
這樣,當使用const的string物件使用操作符時,便會呼叫該const的過載版本。
但是,這樣就ok了嘛?雖然上面的那段**沒有問題了,但是其中卻隱藏了乙個陷阱,看如下**:
const string str = "she";
str[0] = 't';
上面這段**可以編譯,執行通過,str變為了"the"!而str宣告為const的!!
現在,你應該知道了,對於const的該操作符過載函式其返回值也應該是const的,否則就會出現可以通過其修改const物件的漏洞。修改如下:constchar& operator(int posion) const
好了,現在沒有問題了!
我們再回過頭來看一下,為了給string提供乙個操作符來讀寫指定位置的字元,需要提供如下兩個函式,以分別對非const string物件和const string物件提供支援:
char& operator(int posion)
;const char& operator(int posion)const
頂層const和非頂層const和函式過載的問題
不懂頂層const和非頂層const的區別的先檢視我的這篇部落格 介紹const函式過載的問題前,先介紹一下下面 includeusing namespace std int ans 42 void fun int tt int main int main int main int c fun in...
類的const和非const成員函式的過載
類的const和非const成員函式的過載 只要了解過c 的操作符過載的語法,很快就可以寫出下面這個操作符過載函式 char operator int posion function 1 注意,這裡該函式的返回值為乙個引用,否則str 0 c 這樣的語句就會不合法,因為str 0 將是乙個左值。那麼...
類的const和非const成員函式的過載
類的const和非const成員函式的過載 只要了解過c 的操作符過載的語法,很快就可以寫出下面這個操作符過載函式 char operator int posion function 1 注意,這裡該函式的返回值為乙個引用,否則str 0 c 這樣的語句就會不合法,因為str 0 將是乙個左值。那麼...