C++ 成員函數前和函數後加const修飾符區別

博客轉載自: https://www.iteblog.com/archives/214.htmlhtml

分析如下一段程序,闡述成員函數後綴const 和 成員函數前const 的做用ios

#include<iostream>
 
using namespace std;
 
class TestClass {
public:
    size_t length() const;
    const char* getPContent();
    void setLengthValid(bool isLengthValid);
private:
    char *pContent;
    size_t contentLength;       //A
    bool lengthIsValid;         //B
    size_t precontentLength;
};
 
size_t TestClass::length() const{ //函數名後加const
    if(!lengthIsValid){
        contentLength= strlen(pContent);    //C
        lengthIsValid = true;           //D
    }
 
    return contentLength;
}
 
const char* TestClass::getPContent(){//函數名前加const
    return pContent;
}
 
void TestClass::setLengthValid(bool isLengthValid){
    lengthIsValid = isLengthValid;
}
 
int main(void){
    TestClass *tc =new TestClass;
    tc->setLengthValid(false);
    tc->length();
    char * content = tc->getPContent();      //E
    return 0;
}

其中類TestClass中的length函數和getPContent函數分別在函數名後和前加了const修飾符,若是試圖編譯上面的代碼,將會獲得下面的錯誤:函數

裏面有三個錯誤,也就是代碼C、D、E處的三個地方。爲何C和D處的代碼會出錯,緣由以下
length函數名的後面加了const修飾符,這樣說明函數的成員對象是不容許修改的。咱們都知道,在類的成員函數裏面,默認是在成員函數的第一個位置是this指針,若是在成員函數(只能是成員函數,要是類的靜態函數或者是非成員函數就不能夠在函數名後面加上const)後面const,則說明this指針的值是不能夠修改的,只能讀取。而上面的length函數可能會修改裏面的contentLength和lengthIsValid的值,這樣編譯器確定是不容許的,因此這樣是會出現錯誤的。
解決方法是:在類的A、B處的成員前面加上mutable修飾符:this

mutable size_t contentLength;
mutable bool lengthIsValid;

從字面的意思知道,mutalbe是「可變的,易變的」,跟constant(既C++中的const)是反義詞。在C++中,mutable也是爲了突破const的限制而設置的。被mutable修飾的變量,將永遠處於可變的狀態,即便在一個const函數中。這樣在C、D處將不會出錯。
那麼,爲何E處出現了錯誤。這是由於在函數名getPContent前加了const修飾符,意味着該函數返回的值只能是讀取,而不能被修改。而E處的content卻爲char *是能夠被修改的,這與const正好相反了,因此出現了錯誤。解決方法是:在char *前面加上const修飾符,即:spa

const char * content = tc->getPContent(); //E

再去編譯運行,這樣就不會出現錯誤了。指針

相關文章
相關標籤/搜索