Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Привилегированные функции






При написании программ могут встретиться ситуации, когда желательно иметь доступ к личным данным класса, минуя функции-члены этого класса. В частности, бывают случаи, когда необходимо выполнить некоторые действия, используя личные данные разных классов, то есть иметь одновременный доступ к личным данным нескольких классов. Наиболее распространенной является ситуация, когда функции-члены одного класса должны иметь доступ к личным членам другого класса. Язык предоставляет для некоторых функций (как обычных, так и являющихся членами какого-либо класса X) возможность получения доступа к личным членам класса Y. Такая функция называется привилегированной в классе Y. Для объявления привилегированной функции используется служебное слово friend.

Например:

class Y {//...

friend void func ();

//... };

Достаточно распространенной является ситуация, когда все функции-члены одного класса X являются привилегированными в другом классе Y. На этот случай предусмотрена упрощенная форма записи:

class Y {

friend X; };

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

Разницу в способе использования функций-членов класса и привилегированных функций рассмотрим на следующем примере:

class Cl ;

{

// f_func - не личный член класса, несмотря // на его объявление в личной части класса: friend void f_func (Cl*, int); int numb; //Личный член класса Cl public:

void m_func (int); };

//Обратите внимание на способ доступа к личному члену //класса numb из функции-члена класса m_func и из //привилегированной в этом классе функции f_func:

void f_func (Cl* cptr, int i) {

cptr -> numb = i; //Необходим явный указатель на

//объект }

void Cl:: m_func (int i)

{.. " '" ' '; ,

numb = i;

>

void main (}

{

Cl obj;

//Сравните способы вызова и аргументы функций:

f_func(& obj, 10); obj.m_func (10); }

Указание на то, что функция является привилегированной, не транзитивно: если функции класса X являются привилегированными в классе Y, а функции класса Y - в классе Z, то это не означает, что функции класса X при-вилегированы в Z.

Использование спецификатора класса памяти static при объявлении членов класса (статические члены классов)

Класс памяти определяет, какое время жизни имеет объект: локальное или глобальное и из каких частей программы на него можно ссылаться. Объект с глобальным временем жизни существует на протяжении выполнения всей программы. Память локальным переменным выделяется при входе в блок или во время вызова функций в программном стеке. При завершении функции или при выходе из блока память в стеке, отведенная локальным переменным, освобождается. Исключение составляют статические локальные переменные (объявленные со спецификатором памяти static), которые имеют постоянную память, но доступ к ним ограничен областью видимости этой локальной переменной. Спецификатор класса памяти static можно использовать в определении класса с данными-членами класса и с функциями-членами класса. Такие члены называются статическими.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.