Что такое friend c

friend (C++)

В некоторых случаях удобнее предоставлять доступ на уровне членов к функциям, которые не являются членами класса или всем членам в отдельном классе. Только реализатор класса может объявить, что является для него дружественным элементом. Функция или класс не могут объявить себя дружественным элементом для любого класса. В определении класса используйте friend ключевое слово и имя функции, не являющейся членом, или другой класс, чтобы предоставить ему доступ к закрытым и защищенным членам класса. В определении шаблона параметр типа может быть объявлен дружественным.

Синтаксис

Объявления дружественных элементов

При объявлении дружественной функции, которая не была объявлена ранее, эта функция экспортируется во включающую область вне класса.

Функции, объявленные в дружественном объявлении, обрабатываются так, как если бы они были объявлены с помощью extern ключевого слова. Дополнительные сведения см. в разделе extern.

Хотя функции с глобальной областью действия могут быть объявлены как дружественные до объявления своих прототипов, функции-члены не могут быть объявлены как дружественные функции до полного объявления их класса. В следующем коде показано, почему при этом возникает ошибка.

Начиная с C++ 11, существует две формы дружественных объявлений для класса:

Первая форма представляет новый класс F, если в самом внутреннем пространстве имен не найден существующий класс с таким именем. C++ 11. во второй форме не представлен новый класс. его можно использовать, если класс уже объявлен и должен использоваться при объявлении параметра типа шаблона или typedef как дружественного.

В следующем примере friend F ссылается на F класс, объявленный вне области видимости NS.

Используйте friend F для объявления параметра шаблона в качестве дружественного:

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

Хотя весь второй класс должен быть дружественным для первого класса, можно выбрать, какие функции первого класса будут дружественными для второго класса.

дружественные функции

friend Функция — это функция, которая не является членом класса, но имеет доступ к закрытым и защищенным членам класса. Дружественные функции не считаются членами класса; это обычные внешние функции с особыми правами доступа. Друзья не находятся в области класса и не вызываются с помощью операторов выбора членов (. и- ), если они не являются членами другого класса. friend Функция объявляется классом, который предоставляет доступ. friend Объявление можно поместить в любое место объявления класса. На него не влияют ключевые слова управления доступом.

Члены класса как дружественные элементы

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

Класс friend — это класс, все функций-члены которого являются дружественными функциями класса, то есть функции-члены которого имеют доступ к закрытым и защищенным членам другого класса. Предположим, что в классе friend было следующее объявление B :

Управляемый тип (в C++/CLI) не может иметь дружественных функций, дружественных классов или дружественных интерфейсов.

Что такое friend c. Смотреть фото Что такое friend c. Смотреть картинку Что такое friend c. Картинка про Что такое friend c. Фото Что такое friend c
Последствия дружественных отношений

Встроенные определения дружественных элементов

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

Источник

Урок №126. Дружественные функции и классы

Обновл. 13 Сен 2021 |

На этом уроке мы рассмотрим использование дружественных функций и дружественных классов в языке С++.

Проблема

На предыдущих уроках мы говорили о том, что данные вашего класса должны быть private. Однако может возникнуть ситуация, когда у вас есть класс и функция, которая работает с этим классом, но которая не находится в его теле. Например, есть класс, в котором хранятся данные, и функция (или другой класс), которая выводит эти данные на экран. Хотя код класса и код функции вывода разделены (для упрощения поддержки кода), код функции вывода тесно связан с данными класса. Следовательно, сделав члены класса private, мы желаемого эффекта не добьёмся.

В таких ситуациях есть два варианта:

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

Использовать дружественные классы и дружественные функции, с помощью которых можно будет предоставить функции вывода доступ к закрытым данным класса. Это позволит функции вывода напрямую обращаться ко всем закрытым переменным-членам и методам класса, сохраняя при этом закрытый доступ к данным класса для всех остальных функций вне тела класса! На этом уроке мы рассмотрим, как это делается.

Дружественные функции

Дружественная функция — это функция, которая имеет доступ к закрытым членам класса, как если бы она сама была членом этого класса. Во всех других отношениях дружественная функция является обычной функцией. Ею может быть, как обычная функция, так и метод другого класса. Для объявления дружественной функции используется ключевое слово friend перед прототипом функции, которую вы хотите сделать дружественной классу. Неважно, объявляете ли вы её в public- или в private-зоне класса. Например:

Источник

Друзья / FAQ C++

Это то, что позволяет вашему классу предоставлять доступ к себе другому классу или функции.

Друзья могут быть функциями или другими классами. Класс предоставляет своим друзьям права доступа. Обычно разработчик имеет политический и технический контроль и над друзьями, и над функциями-членами класса (в противном случае вам может потребоваться разрешение от владельца других частей, если вы хотите обновить свой собственный класс).

Нарушают ли друзья инкапсуляцию?

Нет! При правильном использовании они улучшают инкапсуляцию.

«Друг» – это явный механизм предоставления доступа, как и членство. Вы не можете (в стандартной программе) предоставить себе доступ к классу без изменения его источника. Например:

Описание модели защиты C++ смотрите в D&E (раздел 2.10) и TC++PL (разделы 11.5, 15.3 и C.11).

Часто бывает необходимо разделить класс пополам, если у этих двух половин будет разное количество экземпляров или разное время жизни. В этих случаях двум половинкам обычно требуется прямой доступ друг к другу (две половины раньше находились в одном классе, поэтому вы не увеличили объем кода, которому требуется прямой доступ к структуре данных; вы просто перетасовали код на два класса вместо одного). Самый безопасный способ реализовать это – подружить эти две половинки.

Точно так же, если вы используете дружественные функции как синтаксический вариант функций, доступных в секции public класса, они не нарушают инкапсуляцию больше, чем ее нарушает функция-член. Другими словами, друзья класса не нарушают барьер инкапсуляции: вместе с функциями-членами класса они являются барьером инкапсуляции.

(Многие люди думают о дружественной функции как о чем-то вне класса. Вместо этого попробуйте думать о дружественной функции как о части открытого интерфейса класса. Дружественная функция в объявлении класса нарушает инкапсуляцию не больше, чем ее нарушает публичная функция-член: обе имеют одинаковые права доступа к закрытым частям класса.)

Какие преимущества/недостатки есть у использования дружественных функций?

Они предоставляют некоторую свободу в вариантах проектирования интерфейса.

Что значит «дружба не передается по наследству, не является переходящей или взаимной»?

Тот факт, что я предоставляю вам дружественный доступ ко мне, не дает автоматически доступ ко мне вашим детям, не предоставляет автоматически доступ ко мне вашим друзьям и не предоставляет мне автоматически доступ к вам.

Что мне лучше объявлять в своем классе, функцию-член или дружественную функцию?

Используйте функцию-член, когда можете, и дружественную функцию, когда вам нужно.

Иногда друзья синтаксически лучше (например, в классе Fred дружественные функции позволяют параметру Fred быть вторым, в то время как функции-члены требуют, чтобы он был первым). Еще одно хорошее применение дружественных функций – это двоичные инфиксные арифметические операторы. Например, aComplex + aComplex должен быть определен как друг, а не как член, если вы хотите разрешить aFloat + aComplex (функции-члены не позволяют продвигать левый аргумент, так как это изменит класс объекта, который является получателем вызова функции-члена).

В остальных случаях выбирайте функцию-член вместо дружественной функции.

Источник

BestProg

Содержание

Поиск на других ресурсах:

1. Для чего используются так называемые «друзья» класса?

Бывают случаи, когда для заданного класса нужно объявить другой класс или функцию, которые должны иметь неограниченный доступ к внутренним переменным и методам класса. Такая необходимость возникает из сути решаемой задачи.

Таким образом, «дружественный» класс или функция дополняют функционал класса в котором они объявлены как «дружественные».

2. Какая общая форма объявления «дружественного» класса? Ключевое слово friend
3. Какая общая форма объявления «дружественной» функции к некоторому классу?

Если нужно объявить «дружественную» функцию в некотором классе, то общий вид такого объявления следующий:

4. В каком месте объявления класса можно объявлять «дружественный» класс или функцию?

Объявлять «дружественный» класс или функцию к заданному классу можно в любом месте или разделе класса в пределах его объявления (между фигурными скобками < >).

5. Сколько «дружественных» функций и «дружественных» классов можно объявлять в теле класса?
6. Как получить объект нужного класса в «дружественной» функции, чтобы иметь доступ ко всем его членам? Пример

Чтобы получить объект нужного класса в функции целесообразно передать в эту функцию ссылку (или указатель) на объект этого класса.

Объявление класса CMyClass и «дружественной» функции в классе имеет следующий вид:

Реализация «дружественной» функции FriendFun() :

7. Пример объявления класса, который есть «дружественным» к другому классу

Листинг классов Number и RangeNum имеет вид:

Использование классов в другом программном коде

Если в классе Number в объявлении «дружественного» класса RangeNum

8. Пример объявления функции, которая есть «дружественной» к другому классу

Листинг приложения типа « Win32 Console Application » следующий:

Как видно из вышеприведенного кода, «дружественные» функции получают входным параметром ссылку или указатель на объект класса, к членам данных и методам которого они имеют неограниченный доступ.

Источник

Дружественные функции и классы в C++

В этом руководстве мы научимся создавать дружественные функции и классы на C++ с помощью примеров. Скрытие данных – фундаментальная концепция объектно-ориентированного программирования, которая ограничивает доступ частных членов извне класса. Точно так же защищенные члены могут быть доступны только производным классам и недоступны извне. Например:

Однако в С++ есть функция, называемая дружественной, которая нарушает это правило и позволяет нам получать доступ к функциям-членам извне класса.

Точно так же есть дружественный класс, о котором мы узнаем позже в этом руководстве.

Что такое дружественная функция в C++?

Дружественная функция в C++ может получить доступ к личным и защищенным данным класса. Мы объявляем функцию, используя ключевое слово friend внутри тела класса.

Пример 1: работа функции

Здесь addFive() – это дружественная функция, которая может обращаться как к частным, так и к публичным элементам данных.

Хотя этот пример дает нам представление о концепции функции, он не показывает какого-либо значимого использования.

Более осмысленное использование будет работать с объектами двух разных классов. В этом случае функция friend может оказаться очень полезной.

Пример 2: добавление членов двух разных классов

В этой программе ClassA и ClassB объявили add(), как дружественную функцию. Таким образом, эта функция может получить доступ к приватным данным обоих классов.

Здесь следует отметить одну вещь: функция внутри ClassA использует ClassB. Однако мы еще не определили ClassB.

Чтобы это работало, нам нужно предварительное объявление ClassB в нашей программе.

Дружественный класс в C++

Мы также можем использовать Friend Class (дружественный класс) в С++, используя ключевое слово friend. Например:

Когда класс объявляется дружественным классом, все функции-члены дружественного класса становятся дружественными функциями.

Поскольку classB является дружественным классом, мы можем получить доступ ко всем членам classA изнутри classB.

Однако мы не можем получить доступ к членам ClassB изнутри classA. Это потому, что дружеские отношения в C++ только предоставляются, но не принимаются.

Пример 3

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *