1. 程式人生 > >c/c++筆試題——const型別的成員函式內部如何改變成員變數

c/c++筆試題——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();

     }

     同樣能夠編譯通過。