Студопедия

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

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

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






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






    При написании программ могут встретиться ситуации, когда желательно иметь доступ к личным данным класса, минуя функции-члены этого класса. В частности, бывают случаи, когда необходимо выполнить некоторые действия, используя личные данные разных классов, то есть иметь одновременный доступ к личным данным нескольких классов. Наиболее распространенной является ситуация, когда функции-члены одного класса должны иметь доступ к личным членам другого класса. Язык предоставляет для некоторых функций (как обычных, так и являющихся членами какого-либо класса 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 :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.