成員函數前後添加const的區別
首先看以下例子:
class Rect{
public:
Rect();
~Rect();
size_t length() const; //在函數後添加const
const char* getContent(); //在函數前添加const
void setLengthValid(bool isLengthValid);
private:
char *pContent;
size_t contentLength; //A
bool lengthIsValid; //B
size_t precontentLength;
};
以上的例子中length()函數後添加了const關鍵字,而getContent前添加了const關鍵字,兩個函數的具體實現如下:
Rect::Rect(){}
Rect::~Rect(){}
size_t Rect::length() const{
if(!lengthIsValid){
contentLength= strlen(pContent); //C
lengthIsValid = true; //D
}
return contentLength;
}
const char* Rect::getContent(){//函數名前加const
return pContent;
}
int main(){
Rect *rc =new Rect;
rc->setLengthValid(false);
rc->length();
char * content = rc->getContent(); //E
return 0;
}
通過運行main中的代碼,我們得到了如下的錯誤:
我們不難看出,在length()函數中,C、D兩處出現了錯誤,原因是:
- 函數後添加const關鍵字,表示函數內部的數是不允許的改變的,僅允許讀;
- 上面的length函數可能會修改裏面的contentLength和lengthIsValid的值,這樣編譯器肯定是不允許的;
而在getContent()函數中,出現錯誤的原因是:
- char*和const char*的轉化出現問題;
- 函數前添加const關鍵字,表示表示數據不允許修改僅允許讀出;
- main函數中,我們通過getContent得到的返回值是const char*,而聲明的content爲char*類型,屬於可變變量;
- 要使得length函數中的錯誤得到修正且正確執行,可在變量前添加mutable關鍵字,表明該變量永遠處於可變的狀態,以此來突破const關鍵字的限制;
- 要使得main函數中類型轉換得到正確執行,我們可以在content的聲明更改成:const char*類型;