根据C ++标准(9.2.3.2静态数据成员)
1静态数据成员不属于类的子对象...
和(9.2.2.1 this指针)
1在非静态(9.2.1)成员函数的主体中,关键字this是一个prvalue表达式,其值是为其调用该函数的对象的地址。在类X的成员函数中,此类型为X *。如果将成员函数声明为const,则其类型为const X *,...。
最后(9.2.2非静态成员函数)
3 ...如果名称查找(3.4)将id表达式中的名称解析为某个类C的非静态非类型成员,并且如果id表达式可能被求值或者C为X或基类X的id表达式使用(* this)(9.2.2.1)作为。左侧的postfix-expression转换为类成员访问表达式(5.2.5)。操作员。
因此,在此类定义中
class A
{
public:
static int a;
void set() const
{
a = 10;
}
};
静态数据成员a
不是类类型对象的子对象,并且指针this
不用于访问静态数据成员。因此,任何成员函数,非静态常数或非常数或静态成员函数都可以更改数据成员,因为它不是常数。
在这个类的定义中
class A
{
public:
int a;
void set() const
{
a = 10;
}
};
非静态数据成员a
是类类型的对象的子对象。要在成员函数中访问它,可以使用暗示该语法的成员访问语法。您不能使用常量指针this
来修改数据成员。而且指针确实const A *
在函数中具有类型,set
因为该函数是用限定符声明的const
。如果在这种情况下该函数没有限定符,则可以更改数据成员。