|
|
В нестатической ($$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.
| |