是否可以在“const”函数中更改Member变量的值?

时间:2015-09-21 01:48:07

标签: c++ visual-c++

常量变量的值可以通过指针技巧来改变,但是可以做这样的事情:

    class A (){
       int x;
    public:
       void func () const {
          //change value of x here
    }
}

6 个答案:

答案 0 :(得分:23)

声明x mutable

class A (){
   mutable int x;
public:
   void func () const {
      //change value of x here
   }
}; 

答案 1 :(得分:10)

您有两种选择:

class C
{
public:
    void const_f() const
    {
        x = 5;                               // A
        auto* p_this = const_cast<C*>(this); // B
        p_this->y = 5;
    }

private:
    mutable int x;                           // A
    int y;
};
  • 答:声明某些成员可变。
  • B:const_cast从this指针中删除constness。

答案 2 :(得分:4)

虽然不理解这一点,但是C ++提供的“后门”可以用来破坏自己的规则,就像脏指针技巧一样。无论如何,您可以通过使用“This”指针的转换版本轻松完成此操作:

class A (){
           int x;
        public:
           void func () const {
              //change value of x here
         A* ptr =  const_cast<A*> (this);
         ptr->x= 10;     //Voila ! Here you go buddy 
        }
 }

答案 3 :(得分:3)

这里要了解的最重要的事情是bitwise/physical/concrete constness and conceptual/meaningwise/logical/abstract constness

简而言之:

  • 如果该功能概念 const,请创建成员数据mutable
  • 否则,请将函数设为非 - const

答案 4 :(得分:1)

只是施放'this',这将是一种实施程序的肮脏方式,如果您正在进行项目或团队合作,请避免这种情况,因为其他人会对此感到困惑。

    class CAST_CLASS (){
       int var;
    public:
       void change_CAST () const {

     CAST_CLASS* pointer =  const_cast<CAST_CLASS*> (this);
     pointer->var= 10;     
    }};

答案 5 :(得分:0)

其他答案未提及此问题,但以下内容也修改了“ x”(肯定是不建议的):

class A {
    int x, &y{x}, *z{&x};
public:
    void func () const
    {
        y  = 42; // x is modified now!
        *z = 29; // x is modified again!!
    }
};