const类型的成员函数内部如何改变成员变量

转自:http://blog.csdn.net/hsujouchen/archive/2009/08/02/4401304.aspx

 

通过指针也能实现。

 

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

     }

     同样能够编译通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值