logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.9.3.1 Указатель this

В нестатической ($$R.9.3) функции-члене служебное слово this обозначает

указатель на объект, с которым эта функция вызывалась. В функции-члене

класса X тип this есть X *const, если только функция-член не описана

со спецификацией const или volatile; для этих случаев this имеет

тип const X *const или volatile X *const соответственно. Если

функция описана с указанием const и volatile, то тип this будет

const volatile X *const, см. также $$R.18.3.3. Приведем пример:

struct s {

int a;

int f() const;

int g() { return a++; }

int h() const { return a++; } // ошибка

};

int s::f() const { return a; }

Операция a++ в теле функции s::h ошибочна, поскольку с ее помощью

делается попытка изменить объект (часть его), с которым вызывалась

функция s::h(). Это недопустимо для функции-члена, описанной со

спецификацией const, т.к. this является указателем на const, иными

словами, *this имеет спецификацию const.

Функция-член const (т.е. функция-член, описанная со спецификацией

const) может вызываться как для объектов const, так и для объектов

без спецификации const, тогда как функция-член без спецификации

const может вызываться только для объектов без спецификации const,

например:

void k(s& x, const s& y)

{

x.f();

x.g();

y.f();

y.g(); // ошибка

}

Здесь вызов y.g() является ошибкой, т.к. y есть const, а s::g() -

функция-член без спецификации const, которая может изменять

(и изменяет) объекты, для которых она вызывалась.

Аналогично, только функция-член volatile (т.е. функция-член,

описанная со спецификацией volatile) может вызываться для объектов

со спецификацией volatile. Функция-член может быть одновременно

const и volatile.

Для объектов const или volatile могут вызываться конструкторы

($$R.12.1) и деструкторы ($$R.12.4). Конструкторы ($$R.12.1) и

деструкторы ($$R.12.4) нельзя описывать со спецификациями const

или volatile.