類成員函數如果使用const進行修飾,則表明該函數不會修改該類的狀況,不會改變類成員信息等,如下所示:
class Date{ int d,y,m;public: int month()const;};內部聲明時使用const后綴進行修飾,外部定義時也需要使用const進行修飾:
int Date::month() { return y++;}如上使用就是錯誤的,第一:沒有加const后綴修飾,第二:改變了類的狀況,此時,該函數就能被編譯器檢測到,并且報錯 正確使用為:
int Date::month() const{ return y;}類成員函數如果使用const進行修飾,則表明該函數不會修改該類的狀況,不會改變類成員信息等,如下所示:
class Date{ int d,y,m;public: int month()const;};內部聲明時使用const后綴進行修飾,外部定義時也需要使用const進行修飾:
int Date::month(){ return y++;}如上使用就是錯誤的,第一:沒有加const后綴修飾,第二:改變了類的狀況,此時,該函數就能被編譯器檢測到,并且報錯 正確使用為:
int Date::month() const{ return y;}const成員函數能被const對象和非const對象調用,因為它本身不改變對象,所以它都能被調用;而非const成員函數只能被非const對象調用,因為函數可能會改變對象,這就違背了const對象不可變的特性。
對于const修飾的成員函數,如果需要修改類成員,可以使用const_cast強制去掉const,但是這種做法看起來并不美觀,但是在邏輯上是const的,但是確實需要改變成員函數,但是對使用者而言是const的,那么可以使用const_cast強制轉換:
int Date::month()const{ auto t=const_cast<Date*>(this); return ++(t->y);}但是這個方法在類本身就是const的情況下是未定義行為,不一定起效,使用g++試了一下是能改變的。
當然最好還是使用mutable修飾需要改變的變量,mutable修飾的變量就是說該變量不可能是const的,使用mutable修飾之后再const函數中就可以正常的改變類成員了,即使是const的對象。
code:
#include<iostream>#include<cstdlib>using namespace std;class Date{ int d,m; mutable int y;public: int month()const; Date(int d,int m=1,int y=2016) { this->d=d; this->y=y; this->m=m; }};int Date::month()const{ return ++y;}int main(){ const Date d(1); cout<<d.month()<<endl; cout<<d.month()<<endl; return 0;}
|
新聞熱點
疑難解答