const成員函數內部如何改變成員變量

原文地址


在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();

     }

     同樣能夠編譯通過。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章