Дружественные функции. Первое знакомство

В С++ есть такое понятие дружественные функции класса. Эта статья ознакомительного характера, очень поверхностно описывается тема дружественности.
Для того, чтобы понять, что вообще такое дружественные функции, достаточно изучить пару простых кодов.

При работе с объектами классов надо разделять работу объекта и его рычагов (вызов методов, использование свойств…) и работу функций, работающих с объектом. Это разделение вообще ключ к хорошему пониманию темы. В листинге #1 внутри функции main происходит попытка вызвать функцию, работающую с объектом. Но при попытке компиляции программы происходит ошибка, подсказчик компилятора пытается докричаться про несанкционированный доступ функции в секцию private. Только классу позволено работать с приватной частью класса, сторонним функциям там делать нечего. Выхода из сложившейся ситуации два: первый — сделать функцию частью класса, второй — сделать функцию дружественной классу. Какой из вариантов выбирать во многом зависит от сложившихся обстоятельств и непосредственно решаемой задачи. В зависимости от выбранного способа дальнейшая обработка будет отличаться. Если сделать функцию частью класса, то доступ к ней будет осуществляться через объект, если функцию не делать частью класса, то доступ к ней будет осуществляться как к любой самой обычной функции.

Когда мы френдим функцию, классу нужно подсказать описание функции. Использованием ключевого слова friend вы выкидываете функции (как часть класса) из класса, но добавляете классу лояльности по отношению к такой функции. Как можно увидеть по листингу #2.2, обычной функции позволено залезать в private-секцию класса, внутри которого её описание (прототип)зафрендено.
Френдить функцию можно в любой секции класса: private, public, protected.

На этот момент, в идеале, должно стать понятным, что имеется в виду под этой (возможно)непонятной ранее формулировкой:

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

Эта статья полностью переписана 13.04.2018

5 комментариев на «“Дружественные функции. Первое знакомство”»

  1. Sergio:

    «При этом первый вариант работы то же самое, что и второй.»
    То есть, как понимаю, использование дружественной функции — дело вкуса? Весомых аргументов в её пользу как-то не увидел, либо плохо читал… Можно ведь спокойно без неё жить и использовать обычную функцию Класса?..

    • то, что я не описал преимуществ не значит, что их нет. Иногда использование дружественных функций удобно использовать, иногда нет. Но если стремиться к максимальной абстракции, то использовать их надо как можно пореже.
      Я видел, что их часто используют при перегрузках операторов и при полиморфизме.
      А не описаны преимущества потому что я этот сайт делал один и, разумеется, не во всем хорошо разобрался. Я уже писал, что слабоват, хотя немного получше некоторых создателей похожих сайтов. Чтобы не вводить в заблуждения читателей, я старался избегать то, в чем слабо понимаю.

  2. Анна:

    Автору огромное спасибо, всё доступно написано, каждая строчка закомментирована и понятна, это боооольшой плюс)
    спасибо ещё раз))

  3. Аноним:

    Сайт просто супер! Спасибо за уроки!

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

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

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/mihail-flenov/bibliya-delphi-644475/?lfrom=15589587
Яндекс.Метрика