關鍵字①:const

成員函數前後添加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兩處出現了錯誤,原因是:

  1. 函數後添加const關鍵字,表示函數內部的數是不允許的改變的,僅允許讀;
  2. 上面的length函數可能會修改裏面的contentLengthlengthIsValid的值,這樣編譯器肯定是不允許的;

而在getContent()函數中,出現錯誤的原因是:

  1. char*和const char*的轉化出現問題;
  2. 函數前添加const關鍵字,表示表示數據不允許修改僅允許讀出;
  3. main函數中,我們通過getContent得到的返回值是const char*,而聲明的content爲char*類型,屬於可變變量;

 

  • 要使得length函數中的錯誤得到修正且正確執行,可在變量前添加mutable關鍵字,表明該變量永遠處於可變的狀態,以此來突破const關鍵字的限制;
  • 要使得main函數中類型轉換得到正確執行,我們可以在content的聲明更改成:const char*類型;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章