Бьерн Страуструп - Абстракция данных в языке С++ - Объект
ОГЛАВЛЕНИЕ
Объект
Структура программы, использующей для разграничения доступа
к представлению типа данных, дружественный механизм классов в
точности такая же как структура программы, не использующей такую
возможность. Отсюда следует, что для облегчения написания
функций, реализующих операции над типом из новой возможности
никаких преимуществ не может быть извлечено. Для многиха типов
может быть получено более элегантное решение путем внедрения
функций в сам новый тип. Например:
class date {
int day, month, year;
public:
void set (int, int, int);
void next ();
void print ();
};
Функции, определяемые таким путем, именуются составляющими
функциями (*1) и могут быть вызваны только для определенной
переменной подходящего типа, используя стандартный синтаксис С
для членов структуры. Так как имена функций более не являются
глобальными, они могут быть короче:
my_birtday.print();
today.next();
С другой стороны, определяя составляющую функцию необходимо
указать как имя функции, так и имя ее класса:
void date.next()
{
/* особый случай */
}
}
О переменных таких типов часто говорят как об объектах. Объект,
для которого вызывается функция, представляет для нее скрытый аргумент.
В составляющих функциях имена членов класса могут быть использованы
без явной ссылки на объект члену класс того объекта,
для которого функция вызывается. Составляющей функции в
некоторых случаях необходимо явным образом сослаться на данный
объект, например, для того, чтобы вернуть на него указатель. Это
достигается путем указания ключевого слова t h i s ,
обозначающее данный объект в любой функции класса. Таким образом
в составляющей функции t h i s - - d a . эквивалентно dа са .
для любой составляющей функции класса.
Метка p u b l i c делит тело класса на две части. Имена
из первой, "приватной" части могут быть использованы только в
составляющих (и дружественных) функциях. Вторая, "публичная"
часть, составляет интерфейс с объектом класса. Функция класса
может обратиться как к публичным так и приватным членам любого
объектам класса, а не только к членам того объекта, для которого
она была вызвана.
Относительные достоинства дружественных и составляющих
функций будут обсуждаться в секции 1, после того как будет
представлено значительное число примеров. Сейчас будет достаточно
заметить, что дружественная функция не затрагивается "приватно-
публичным" механизмом и оперирует объектом стандартным явным
образом. Составляющая функция, напротив, должна вызываться для
конкретного объекта, она отличает этот объект от всех прочих.