const 和 非const函式過載

2021-07-03 19:08:42 字數 1911 閱讀 6496

在下面的**中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 將是乙個左值。那麼...