在以下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
数据成员?
答案 0 :(得分:94)
这就是规则,就是这样。并且有充分的理由。
成员函数上的const
限定符意味着您无法修改非mutable
非static
类成员变量。
通过提供一些合理化,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=10
与this->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-mutable
,non-static
类数据成员。