Согласно стандарту C ++ (9.2.3.2 Статические элементы данных)
1 Статический член данных не является частью подобъектов класса ...
И (9.2.2.1 Указатель this)
1 В теле нестатической (9.2.1) функции-члена ключевое слово this является выражением prvalue, значение которого является адресом объекта, для которого вызывается функция. Тип this в функции-члене класса X - X *. Если функция-член объявлена как const, ее типом будет const X * , ...
И наконец (9.2.2 Нестатические функции-члены)
3 ... если поиск по имени (3.4) разрешает имя в id-выражении в нестатический не типовой член некоторого класса C, и если либо id-выражение потенциально оценивается, либо C является X или базовым классом для X, выражение id преобразуется в выражение доступа к члену класса (5.2.5) с использованием (* this) (9.2.2.1) в качестве постфиксного выражения слева от. оператор.
Таким образом, в этом определении класса
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
для изменения элемента данных. И указатель this действительно имеет тип const A *
внутри функции, set
потому что функция объявлена с квалификатором const
. Если бы функция не имела квалификатора, в этом случае член данных можно было бы изменить.