Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Глава 4. Дружественные классы и функции
Дружественные функции Применяются для доступа к скрытым полям класса и представляют собой альтернативу метода, т.к. метод как правило используется для реализации свойств объекта. Дружественные функции используются, когда оформляется действие, не представляющее собой свойство класса, но входящее в интерфейс класса и нуждающееся в доступе к его скрытым полям. Свойства дружественных функций: · объявляются внутри класса, к элементам которого им необходим доступ. При этом используется служебное слово friend. В качестве параметра дружественной функции передается объект или ссылка на объект в классе, т.к. this ей не передается (поскольку она не является членом класса). · она может быть обычной функцией, либо методом другого, ранее определенного класса. На дружественные функции не распространяется действие спецификаторов доступа. Место ее размещения и объявления в классе безразлично. · функция, объявленная дружественной, может являться таковой сразу в нескольких классах. Пример 1 class monstr; /* предварительное объявление класса */ Class hero { public: void kill(monstr &); }; Class monstr { friend int steal_ammo(monstr &); friend void hero::kill(monstr &); /* класс hero должен быть определен ранее */ }; int steal_ammo(monstr &M) { return --M.ammo; } void hero::kill(monstr&M) { M.health = 0; M.ammo = 0; }
Использование дружественных функций по возможности нужно избегать, так как они нарушают принцип инкапсуляции.
Дружественный класс Если все методы какого-либо класса должны иметь доступ к скрытым полям другого класса, то он объявляется дружественным классом с помощью ключевого слова friend. Пример 1 Class hero { friend class mistress; }; Class mistress { void f1(...); void f2(...); };
Класс сам определяет, какие функции являются дружественными, а какие нет. Функции f1 и f2 – дружественные по отношению к классу hero и имеют прямой доступ ко всем полям класса. Пример 2 #include <stream.h> struct employee { friend class manager; employee* next; char* name; short department; virtual void print(); }; struct manager: employee { employee* group; short level; void print(); }; Void employee::print() { cout << name << "\t" << department << "\n"; } Void manager::print() { employee::print(); cout << "\tlevel " << level << "\n"; } void f(employee* ll) { for (; ll; ll=ll->next) ll->print(); } Main () { employee e; e.name = "J. Brown";
e.department = 1234; e.next = 0; manager m; m.name = "J. Smith"; m.department = 1234; m.level = 2; m.next = &e; f(&m); }
Глава 5. Локальные и вложенные классы Локальный класс Если класс объявляется внутри некоторой функции, то он называется локальным. Функция, в которой объявлен локальный класс, не имеет непосредственного доступа к компонентам локального класса. Доступ осуществляется с помощью указателя имени объектов встроенного класса.
Локальный класс не может иметь статических полей. Объекты локального класса могут быть созданы только внутри функции в области действия объявления класса, причем все компонентные функции локального класса должны быть встраиваемыми: Пример 1 int x; Void f() { static int s; int x; extern int g(); struct local { int g() { return x; } // ошибка, auto x int h() { return s; } // OK int k() { return::x; } // OK int l() { return g(); } // OK }; //... } local* p = 0; // ошибка: нет local в текущем контексте Вложенный класс. Класс, объявленный внутри другого класса, называют вложенным. Вложенный класс находится в области действия того класса, внутри которого он объявлен. Соответственно, объекты вложенного класса могут использовать компоненты внешнего класса, а компонентные функции и статические компоненты вложенного класса могут быть описаны вне глобального класса. Пример 1 class Figura { Class Point // вложенный класс Point { int x, y, color; public: int getx() { return x; } int gety() { return y; } int getcolor() { return color; } ....... }; Class Line // вложенный класс Line {
|
|||||
Последнее изменение этой страницы: 2021-07-18; просмотров: 65; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.182.45 (0.009 с.) |