|
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
|
|
дружественные функции в C++. Когда без них невозможно?12.09.2012, 22:20. Показов 5224. Ответов 30
Метки нет (Все метки)
Здравствуйте! Есть ли ситуации, когда без дружественных функций невозможно обойтись
или всегда можно заменить ее обычной функцией/методом? Если без нее обойтись нельзя, напишите пожалуйста пример) Т.е. по сути friend-функция просто избавляет от написания дополнительных функций для возврата тех значений, которые как бы и не обязательно возвращать, но из-за невозможности доступа в обычных функциях к скрытым полям класса приходится? И только?
0
|
|
| 12.09.2012, 22:20 | |
|
Ответы с готовыми решениями:
30
Бывает ли ситуация, когда невозможно решить задачу без безымянных namespaces?
|
|
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
|
||
| 13.09.2012, 01:45 | ||
|
0
|
||
|
Комп_Оратор)
|
|
| 13.09.2012, 02:54 | |
|
У Г. Шилдта в "C++ Базовы курс" 3-е изд. в главе "Перегрузка операторов с использованием функций не членов класса.", приводится пример использования функции friend для перегрузки оператора сложения. Там говорится, что при перегрузке бинарной операции методом класса, первым параметром ей передается левый операнд (неявно), a вторым, - правый (явно). Это работает для случая a+b или случая a+10, но не подходит для вычисления выражения 10+а. Поэтому для перегрузки используется внешняя функция, принимающая явно два параметра. И тут пишет он "... функция-дрг оказывается чрезвычайно полезной...". Далее по тексту видно, что такую перегрузку можно выполнить и внешней функцией. Но тогда различий, кроме как только в скорости доступа к защищенным полям и не обнаруживается (внешней функции требуется вызывать функцию член через экземпляр переданный справа). Для сложения числа с 3D_Point из его примера - требуется три раза вызвать. А для умножения матрицы 5x5 на число, - 25 раз. Может в этом и дело?
0
|
|
|
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
|
||||
| 13.09.2012, 07:21 [ТС] | ||||
|
cName & operator+(const cName & obj1, const cName & obj2) { return cName(obj.get_val() + obj.get_val()); } ? Если да, то почему только через экземпляр справа? cName & operator+(const int & obj1, const cName & obj2) { return cName(obj1*obj2.get_x(),...,obj1*obj2.ge t_z()); } ? Добавлено через 2 минуты можно же сделать, чтобы он вернул вектор, т.е. написать один такой getVector, который возвращал бы сразу x,y,z...
0
|
||||
|
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
|
||
| 13.09.2012, 10:37 | ||
|
0
|
||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 13.09.2012, 12:56 | |
|
PSIAlt, Нет. Это спорный вопрос. Слишком спорный, чтобы советовать использовать возвращение констант.
0
|
|
|
Комп_Оратор)
|
||||||||
| 13.09.2012, 13:36 | ||||||||
0
|
||||||||
|
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
|
||
| 13.09.2012, 13:52 | ||
|
Интересно, зачем может понадобиться поменять результат сложения? Можно взять результат и использовать его для каких-то других вычислений, сохранить или еще что. Никому же в голову не приходит что результат выражения 2+2 можно както менять? Хотя, конечно если кто-то все еще пишет классы в которых operator+ делает что-то не имеющего ничего общего со сложенем, то да... Но надеюсь такие кодеры вымерли.
0
|
||
|
Комп_Оратор)
|
||
| 13.09.2012, 14:22 | ||
0
|
||
|
~ Эврика! ~
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
||
| 13.09.2012, 17:04 | ||
|
Вместо того, чтобы сделать это в одной строке гораздо понятнее и без всяких извращений. Это не дело метода (тем более внешнего), что потом будут делать с возвращаемым им значением.
0
|
||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||
| 15.09.2012, 14:22 | ||
|
0
|
||
| 15.09.2012, 14:22 | |
|
Удалённые хуки. Когда для них нужно создавать *.dll, а когда необязательно?
Дружественные функции Дружественные функции Дружественные функции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
|
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
|
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения.
https:/ / habr. com/ ru/ sandbox/ 295048/
начало и оглавление
-
Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
|
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
|
|
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
|
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
|
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0)
Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона
Уважаемые коллеги!
В продолжение. . .
|
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии
Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
|