l-value specifies const object

來源:互聯網
上載者:User

 

在C++中,由const修飾的成員函數的函數體內部,是不能夠對成員變數進行修改的。這個特性被用來保證某些成員函數在實現過程中,避免由於程式員大意而對資料進行了錯誤的修改;同時也說明此成員函數是非修改性的。如只需要返回成員變數的成員函數就被聲明為const類型(const的位置在函數定義參數列表之後)

      推廣開來,在const成員函數中也不能夠調用非const的成員函數。這是因為非const成員函數可能會改變成員變數的值,這與const成員函數的定義相違背。

      但是在某些情況下,需要在const函數中改變成員變數。這就需要把成員變數設定成mutable類型。如

class C

{

public:

      void func(const int& p) const

      {

         i = p;

      }

private:

    mutable int i;

};

    如果變數i不聲明為mutable類型,則編譯不會通過。

    如果成員變數是一個類類型或者結構類型,而在const函數中調用這些變數的成員函數,除了用mutable聲明外,還可以用一種變通的方法:

class D

{

    public:

       void op(){}

}

class C

{

public:

      void func(const int& p, D& d) const

      {

         i = p;

         d.op();

      }

private:

    mutable int i;

    D                cd;

};

然後在調用時,參數D& d以*this作為輸入,也可以達到調用非const函數的作用。

P.S 最近閱讀相關的文章,又學到了一種方法,能夠使得在const成員函數中調用非const成員函數。就是使用const_cast<>運算子。它能夠使得const去掉const的屬性,使得violate屬性去掉violate屬性。上面的例子就可以寫成。

      void func() const

     {

          const_cast<D*>(&cd)->op();

     }

     同樣能夠編譯通過。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.