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

來源:互聯網
上載者:User

標籤:代碼   new   lan   private   etl   arch   c++   include   har   

部落格轉載自: https://www.iteblog.com/archives/214.html

分析以下一段程式,闡述成員函數尾碼const 和 成員函數前const 的作用

#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修飾符:

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修飾符,即:

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

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

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.