Справочное руководство по C++ | страница 57



Результат вызова нестатической функции-члена (§R.9.4) класса X, когда она вызывается не с объектом класса X, неопределен.

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.

R.9.3.2 Функции-члены со спецификацией inline

Функцию-член можно определить (§R.8.3) в описании класса, в таком случае она считается подстановкой (inline, §R.7.1.2). Определять функцию в описании класса - это эквивалентно тому, чтобы описывать функцию и определять ее со спецификацией inline сразу же после описания класса. Считается, что такой перенос определения функции происходит после препроцессорной обработки до стадии синтаксического анализа и контроля типов. Поэтому программный фрагмент