C++ для начинающих Дружественные функции Первое знакомство

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

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

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

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

Код C++ Дружественная функция и обычная функция Класса

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

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

    Так как элемент x был объявлен внутри private, то для отображения этого x необходим посредник, в качестве посредника работает функция show() . Функция show() объявлена внутри класса и значит все поля класса ей доступны. Я надеюсь вы изучили, что такое поле private и дальнейшее описание будет лишним

    Коротко говоря:
Внутри класса объявлены

  • Приватный элемент x
  • Дружественная функция ввода в x значения
  • Обычная функция ввода в x значения
  • Функция для отображения приватного элемента

После описания класса идет написание функций.
Первой написана функция, которая принимает некоторый параметр N и принимает экземпляр класса, записывает этот N в x вовнутрь принятого экземпляра класса. Функция не опирается на класс и описана как самостоятельно-независимая. Возможно это как раз благодаря ключевому слову friend перед прототипом этой самой функции внутри класса. Еще раз отмечу, что такую функцию возможно описать внутри поля private

    Второй описывается функция, которая принимает только один параметр. При этом функция опирается на класс A и следовательно заносит принимаемый параметр вовнутрь того класса на который и опирается.

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

  • Функция friend может быть объявлена даже внутри private и посредники ей не нужны
  • Обычная функция класса требует посредников для работы с элементами из private

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

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

  • В первом случае обычная функция принимает параметры и обрабатывает их
  • Во втором случае обрабатываем класс через соответствующий объект

    При этом первый вариант работы то же самое, что и второй.

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

5 комментариев: C++ для начинающих Дружественные функции Первое знакомство

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

    😳

  • Sergio говорит:

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

    • admin говорит:

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

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

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

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

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

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

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

Поиск

 
     

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

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

В черном-черном городе, на черной-черной улице, в черном-черном доме, в черно-черной квартире сидит черный-черный мужик и говорит: - Никогда больше не буду сам заправлять картриджи!

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

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