Відповідно до стандарту C ++ (9.2.3.2 Статичні дані)
1 Статичний елемент даних не є частиною підпроектів класу ...
І (9.2.2.1 Цей покажчик)
1 У тілі нестатичної (9.2.1) функції-члена ключове слово this є виразом prvalue, значення якого є адресою об'єкта, для якого функція викликається. Тип цього у функції-члена класу 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
для зміни елемента даних. І покажчик, який це справді, має тип const A *
усередині функції, set
оскільки функція оголошена за допомогою кваліфікатора const
. Якщо у функції не було кваліфікатора, в цьому випадку член даних можна було б змінити.