Опубликован: 26.06.2003 | Доступ: свободный | Студентов: 36764 / 5417 | Оценка: 4.07 / 3.80 | Длительность: 15:08:00
ISBN: 978-5-9556-0017-8
Лекция 11:

Контроль доступа к объекту

< Лекция 10 || Лекция 11: 123 || Лекция 12 >

Объявление friend

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

class String
{
   . . .
   friend String concat(const String& s1,
               const String& s2);
};

Тогда функция concat может быть реализована следующим образом:

String
concat(const String& s1, const String& s2)
{
   String result;
   result.length = s1.length + s2.length;
   result.str = new char[result.length + 1];
   if (result.str == 0) {
        // обработка ошибки
   }
   strcpy(result.str, s1.str);
   strcat(result.str, s2.str);
   return result;
}

С помощью механизма friend можно разрешить обращение к внутренним элементам класса как отдельной функции, отдельному методу другого класса или всем методам другого класса:

class String 
{
   // все методы класса StringParser обладают
   // правом доступа ко всем атрибутам класса
   // String
   friend class StringParser;
   // из класса Lexer только метод CharCounter 
   // может обращаться к внутренним атрибутам 
   // String
   friend int Lexer::CharCounter(const 
                         String& s, char c);
};

Конечно, злоупотреблять механизмом friend не следует. Каждое решение по использованию friend должно быть продумано. Если только одному методу какого-либо класса действительно необходим доступ, не следует объявлять весь класс как friend.

< Лекция 10 || Лекция 11: 123 || Лекция 12 >
Елена Шумова
Елена Шумова

Здравствуйте! Я у Вас прошла курс Язык программировая Си++.

Заказала сертификат. Хочу изменить способ оплаты. Как это сделать?

Маргарита Башкатова
Маргарита Башкатова
Дарья Ильина
Дарья Ильина
Россия, Барнаул, Алтайский Государственный университет, 2016
Игорь Хан
Игорь Хан
Узбекистан, Ташкент, Ташкентский педагогический институт иностранных языков, 1990