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

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

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

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

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

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

Эта статья полностью переписана 13.04.2018
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

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

  • Аноним говорит:

    😳




    0



    0
  • Sergio говорит:

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




    0



    0
    • admin говорит:

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




      0



      0
  • Анна говорит:

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




    0



    0
  • Аноним говорит:

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




    0



    0

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

Ваш e-mail не будет опубликован.

1 + 8 =

Поиск

 
     

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

https://www.litres.ru/v-petin/sayt-na-ajax-pod-kluch-gotovoe-reshenie-dlya-internet-magazina-2/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Девушка-программист едет в трамвае, читает книгу. Старушка смотрит на девушку, смотрит на книгу, крестится и в ужасе выбегает на следующей остановке. Девушка читала книгу "Язык Ада"

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок