为什么const成员函数可以修改静态数据成员?

时间:2017-05-12 11:11:16

标签: c++ function c++11 static const

在以下C++计划中,从const功能修改静态数据成员工作正常:

class A 
{
  public:   
    static int a; // static data member

    void set() const
    {
        a = 10;
    }
};

但是从const函数修改非静态数据成员不起作用:

class A 
{
  public:   
    int a; // non-static data member

    void set() const
    {
        a = 10;
    }
};

为什么const成员函数可以修改static数据成员?

3 个答案:

答案 0 :(得分:94)

这就是规则,就是这样。并且有充分的理由。

成员函数上的const限定符意味着您无法修改非mutablestatic类成员变量。

通过提供一些合理化,this限定成员函数中的const指针是const类型,this本质上与相关类的实例static个成员与类实例无关。您不需要实例来修改static成员:在您的情况下,您可以通过编写A::a = 10;来执行此操作。

因此,在您的第一种情况下,将a = 10;视为A::a = 10;的简写,在第二种情况下,将其视为this->a = 10;的简写,因为类型不可编译this的{​​{1}}。{/ p>

答案 1 :(得分:13)

问题是,如果类A的成员函数是const,则this的类型为const X*,从而防止非静态数据成员被改变(参见,例如,C++ standard):

  

9.3.2这个指针[class.this]

     

在非静态(9.3)成员函数的主体中,关键字this是一个prvalue表达式   value是调用函数的对象的地址。   类X的成员函数中的类型是X *。如果   成员函数声明为const,其类型为const X *,...

如果a是非静态数据成员,则a=10this->a = 10相同,如果this的类型为{{1},则不允许const A*并且a尚未声明为mutable。因此,由于void set() const使this的类型为const A*,因此不允许此访问。

如果a是静态数据成员,相反,a=10根本不涉及this;只要static int a本身未被声明为const,就允许声明a=10

答案 2 :(得分:1)

成员函数上的const限定符意味着您无法修改non-mutablenon-static 类数据成员