Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Марченко А.Л. -> "С++ бархатный путь " -> 92

С++ бархатный путь - Марченко А.Л.

Марченко А.Л. С++ бархатный путь — М.: Горячая линия - Телеком, 2005. — 399 c.
ISBN 5-93517-056-6
Скачать (прямая ссылка): barhatniyput2005.djvu
Предыдущая << 1 .. 86 87 88 89 90 91 < 92 > 93 94 95 96 97 98 .. 152 >> Следующая

В C++ дружба является односторонним отношением. Дружественные классу функции не являются функциями-членами этого класса. Они не могут быть вызваны от имени объекта-представителя класса, содержащего объявления дружественных функций при помощи операций доступа к члену класса.
Дружественная функция может быть функцией-членом другого класса. Правда, при этом само определение дружественной функции приходится располагать после объявления класса, другом которого была объявлена данная функция.
236
Дружественная функция не имеет this указателя для работы с классом, содержащим её объявление в качестве дружественной функции.
Дружественные отношения не наследуются. Дружественные функции не имеют доступа к членам класса-наследника, чьи бвзовые классы содержали объявления этих функций. Дети не отвечают за отношения своих родителей.
А теперь рассмотрим небольшой пример использования дружественных функций. В программе объявлены два класса, один из которых является другом другого класса и всеобщая дружественная функция.
¦include <iostrea®.h> class XXX;
/* Неполное объявление кл«сс«. Оно необходимо для о№м«лвмия ТИЛ* параметра фугоецки-член* для следующего класс*. */
class 14*4
(
private: int ml; public:
>**f(int val) ;
void PrintVal(char +QbjectNa»e, XXXS ClassParam);
>;
«*І: int val)
{
al » val;
I
/¦ Определение фу нгшои - члена PrintVal. располагается после объявления класса XXX. Только тогда транслятор уэнайт о структуре класса, к которому должка получить доступ функция Н&І: :PrintVal. ¦/
class ххх
{
friend claas YYY;
friend void МММ: :PrintVal(char *ObjectNaii»e, XXX? ClassParan); friend void PrintVal(XXX* ClaesParamX, YYY 4 ClsssParanY);
/* В классе объявляются три друга данного класса: класс YYY, функция-член класса простая функция PrintVal. В класс XXX вюдачаются ливь объявления
дружественных функций и классов. Все определения располагаются в других пестах - такі где им и положено быть - в своих собственных областях видимости.
*/
private: int xl; public:
XXX(int val);
XXX: :XXX(mt val)
xl - val;
void ЪЪМ', -.Prmtvel (char *ObjectNaja«, XXX* СІвзаРвга») cout « “Значение w « Ob^ectNeroe « ": * « ClassParaa.xl « endl;
237
- Отложенное определение функции-члена *¦**!: -.PrintVal, */
class yyy
I
friend void PrintVal (XXXt ClassParanX, YYYt ClasaParamY) ;
private ir.t yl; public:
YYY (int val) ;
void PrintVal (char ‘ObjeetNasie, ИХ* ClassParaa);
m . ;YYY (int V*l»
{
yl - val;
void YYY: :PrintV»l(char ‘ObjectMane, XXXS ClaaaParaia}
(
cout « "Зиачемме " « ObjactHBM « и: " « ClaseParam.xi « endl:
void PrintVal (XXXt ClassParaaX, YYY* ClassParamY) ; void nainO {
XXX ветІШ;
XXX men2(2) :
XXX татЗ(Э);
// Определят объекты-представители класс* XXX.
YYY displ (1) :
YYY dispZ(Z); і/ Определены обпекти-представители класс* YYY.
№М special (0) ;
II Определен объект-представитель класса №<4.
displ.PrintVal("meal", noml); displ. PrintVal (Maam2> , ввш2) ; disp2.PrintVal С*во>3<', яяиЗ);
II Функция-члои класса YYY имеет доступ к частным членам класса XXX.
special.PrintVal(*\п нет? from special еру:'', яот2) ;
II Функция-член класса ЬМІ Иимт доступ к частным членам класса XXX.
PrintVal(manl, disp2);
PrintVal(mea>2, displ);
II *у№ш« имеет доступ к частных членам классов XXX И YYY.
)
void PrintVal(XXXS ClaasParaoX, YYYt ClassParamY)
(
cout « endl;
cout « *???.*1 —• " « ClassParanX.xl « endl; cout « "???.yl mm " « ClassParaaY.yl « endl:
!
В этом примере все функции имеют одинаковые имена. Конфликта имён не происходит, поскольку эти имена располагаются в разных областях действия.
238
Указатели на объекты
Рассмотрим простой пример: #include <iostraan.h> class А
class АВ: public А
class AC: publio A
void nain ()
{
А *рОЬЗ;
A MyA;
pObj ш ?MyA;
cout « "OK A" « endl;
AB MyAB;
AC My AC ;
pObj - SMyAB;
cout « "OK AB" « endl;
pObj - ШуАС;
cout « "OK AC" « endl;
)
Это очень простой пример. Пустые классы, простое наследование... В объявлении этих классов принципиальны лишь спецификаторы доступа в описании баз классов-наследников. Члены базового класса (его будущие члены) должны быть доступны в классе-наследнике. Первый оператор функции main() - объявление указателя на объект класса А. Затем следует определение объекта-представителя класса А, следом - настройка указателя на этот объект. Естественно, при этом используется операция взятия адреса. Всё это давно известно и очень просто. Следующие две строки являются определениями пары объектов, которые являются представителями двух разных классов-наследников...
239
За объявлениями объектов в программе располагаются строки, которые свидетельствуют о том, указатель на базовый класс можно настроить на объект класса-наследника. Для настройки указателя на объект класса-наследника не требуется никаких дополнительных преобразований. Здесь принципиально только то, что между классами должно существовать отношение наследования. Так проявляется очень важное свойство объектно-ориентированного программирования: УКАЗАТЕЛЬ НА
Предыдущая << 1 .. 86 87 88 89 90 91 < 92 > 93 94 95 96 97 98 .. 152 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.