Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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; просмотров: 142; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.156 (0.006 с.) |