Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
78
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Часть II. Объектно-ориентированное программирование

// Присваивание значения указателю: pget - & monstr: -.getjiealth; monstr Vasia. *p; p - new monstr;

// Вызов функции через операцию .* : int Vasinjiealth - (Vasia.*pget)(); // Вызов функции через операцию ->* : int p_health - (p->*pget)();

Ниже перечислены правила использования указателей на методы классов.

  • Указателю на метод можно присваивать только адреса методов, имеющих соответствующий заголовок.

  • Нельзя определить указатель на статический метод класса.

  • Нельзя преобразовать указатель на метод в указатель на обычную функцию, не являющуюся элементом класса.

Как и указатели на обычные функции, указатели на методы используются в том случае, когда возникает необходимость вызвать метод, имя которого неизвестно. Однако в отличие указателя на переменную или обычную функцию, указатель на метод не ссылается на определенный адрес памяти. Он больше похож на индекс в массиве, поскольку задает смещение. Конкретный адрес в памяти получается путем сочетания указателя на метод с указателем на определенный объект.

ПРИМЕЧАНИЕ

Методы, вызываемые через указатели, могут быть виртуальными. При этом вызывается метод, соответствующий типу объекта, к которому применялся указатель.

Формат указателя на поле класса:

тип_данных(имя_класса::*имя_указателя); В определение указателя можно включить его инициализацию в форме:

&имя_класса::имя_поля;// Поле должно быть public

Если бы поле health было объявлено как public, определение указателя на него имело бы вид:

int (monstr::*phealth) - &monstr::health:

cout « Vasia.*phealth; // Обращение через операцию .*

cout « p->*phealth; // Обращение через операцию ->*

Обратите внимание на то, что указатели на поля классов не являются обычными указателями — ведь при присваивании им значений они не ссылаются на конкретный адрес памяти, поскольку память выделяется не под классы, а под объекты классов.

Рекомендации по составу класса

Как правило, класс как тип, определенный пользователем, должен содержать скрытые (private) поля и следующие функции:

Глава 4. Классы

199

Q конструкторы, определяющие, как инициализируются объекты класса;

Q набор методов, реализующих свойства класса (при этом методы, возвращающие значения скрытых полей класса, описываются с модификатором const, указывающим, что они не должны изменять значения полей);

  • набор операций, позволяющих копировать, присваивать, сравнивать объекты и производить с ними другие действия, требующиеся по сути класса;

  • класс исключений, используемый для сообщений об ошибках с помощью генерации исключительных ситуаций (об этом будет рассказано на с. 228).

Если существуют функции, которые работают с классом или несколькими классами через интерфейс (то есть доступ к скрытым полям им не требуется), можно описать их вне классов, чтобы не перегружать интерфейсы, а для обеспечения логической связи поместить их в общее с этими классами пространство имен, например:

namespace Staff{

class monstr { /* ... */}: class hero { /* ... */}; void interact(hero, monstr);

}