Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183

дружественные функции в C++. Когда без них невозможно?

12.09.2012, 22:20. Показов 5226. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть ли ситуации, когда без дружественных функций невозможно обойтись
или всегда можно заменить ее обычной функцией/методом? Если без нее обойтись нельзя, напишите пожалуйста пример) Т.е. по сути friend-функция просто избавляет от написания дополнительных функций для возврата тех значений, которые как бы и не обязательно возвращать, но из-за невозможности доступа в обычных функциях к скрытым полям класса приходится? И только?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.09.2012, 22:20
Ответы с готовыми решениями:

Когда стоит использовать класс, а когда лучше обойтись без них?
Когда стоит использовать класс, а когда лучше обойтись без них? Когда следует использовать несколько классов? Вот, например. Программа...

Бывает ли ситуация, когда невозможно решить задачу без безымянных namespaces?
Добрый вечер, подскажите есть ли ситуация где без него не решить задачу?

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

30
 Аватар для PSIAlt
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
13.09.2012, 01:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Jupiter Посмотреть сообщение
не то, ибо operator+ не должен модифицировать сам объект для которого предполагается вызов
Даже больше: он вообще должен быть const, принимать const и возвращать const xD Но это какбы не мешает ему жить в классе к которому он имеет непосредственное отношение, а наверно даже помогает
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.09.2012, 01:57
Цитата Сообщение от PSIAlt Посмотреть сообщение
и возвращать const
это спорный вопрос

Цитата Сообщение от PSIAlt Посмотреть сообщение
Но это какбы не мешает ему жить в классе к которому он имеет непосредственное отношение, а наверно даже помогает
чем меньше свойств и методов тем лучше
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
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  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Далее по тексту видно, что такую перегрузку можно выполнить и внешней функцией
под внешней разумеется

cName & operator+(const cName & obj1, const cName & obj2)
{
return cName(obj.get_val() + obj.get_val());
}

?

Если да, то почему только через экземпляр справа?

Цитата Сообщение от IGPIGP Посмотреть сообщение
внешней функции требуется вызывать функцию член через экземпляр переданный справа

Цитата Сообщение от IGPIGP Посмотреть сообщение
Для сложения числа с 3D_Point из его примера - требуется три раза вызвать.
Три раза вызвать, в смысле имеется три поля в классе A: x,y,z и для каждого поля есть свой метод get_x(),...,get_z() и во внешней функции вызываются все три метода подряд? Т.е. как бы

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
 Аватар для PSIAlt
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
13.09.2012, 10:37
Цитата Сообщение от Jupiter Посмотреть сообщение
Цитата Сообщение от PSIAlt Посмотреть сообщение
возвращать const
это спорный вопрос
Бывают конечно ситуации, но вообще вопрос слабо спорный. operator+ равно как и другие математические операторы должны возврачать const - это если по-хорошему делать. См. Мейерса
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
13.09.2012, 12:56
PSIAlt, Нет. Это спорный вопрос. Слишком спорный, чтобы советовать использовать возвращение констант.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.09.2012, 13:36
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
под внешней разумеется

cName & operator+(const cName & obj1, const cName & obj2)
{
return cName(obj.get_val() + obj.get_val());
}

?

Если да, то почему только через экземпляр справа?
Пример же для бинарной операции со встроенным типом слева от оператора:
C++
1
2
3
4
int a;
Class B;
Class C=a*B;//слева int, а справа эземпляр (он и передается)
C=10+B;//та же песня

Три раза вызвать, в смысле имеется три поля в классе A: x,y,z и для каждого поля есть свой метод get_x(),...,get_z() и во внешней функции вызываются все три метода подряд? Т.е. как бы

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
 Аватар для PSIAlt
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
13.09.2012, 13:52
Цитата Сообщение от ForEveR Посмотреть сообщение
PSIAlt, Нет. Это спорный вопрос. Слишком спорный, чтобы советовать использовать возвращение констант.
Секундочку, речь идет только про operator+, operator* и аналогичные.
Интересно, зачем может понадобиться поменять результат сложения? Можно взять результат и использовать его для каких-то других вычислений, сохранить или еще что. Никому же в голову не приходит что результат выражения 2+2 можно както менять?
Хотя, конечно если кто-то все еще пишет классы в которых operator+ делает что-то не имеющего ничего общего со сложенем, то да... Но надеюсь такие кодеры вымерли.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.09.2012, 14:22
Цитата Сообщение от PSIAlt Посмотреть сообщение
Секундочку, речь идет только про operator+, operator* и аналогичные.
Интересно, зачем может понадобиться поменять результат сложения? Можно взять результат и использовать его для каких-то других вычислений, сохранить или еще что. Никому же в голову не приходит что результат выражения 2+2 можно както менять?
Хотя, конечно если кто-то все еще пишет классы в которых operator+ делает что-то не имеющего ничего общего со сложенем, то да... Но надеюсь такие кодеры вымерли.
PSIAlt, думаю речь о бинарных операторах вообще, а не только для + и * , например для - тоже. И как вычесть если не дистрибутивная операция? Надо же 10-a получить, а не а-10. Конечно можно объяснить юзеру, что Ваш класс это делает так: -(a-10), но зачем? А если у Вас перегружена операция > , то и < перегружать (?) или дать возможность сравнить большую матрицу с числом так: if(10>a). Пусть живут разные кодеры.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.09.2012, 17:04
Цитата Сообщение от PSIAlt Посмотреть сообщение
Никому же в голову не приходит что результат выражения 2+2 можно както менять?
Да, думаю, дело больше в том, что в Си++ есть такая штука как const-qualified методы. И если в результате сложения надо вернуть класс, который трогать нельзя, то придётся копировать результат сложения в переменную, чтобы вызывать его не-const метод, но который хоть фактически может быть const (то есть не изменять состояние объекта), но cv-правила дадут по рукам за попытку его вызвать. А взять и дописать ему const нельзя. Разве что снимать constness с помощью const_cast, что тоже не ахти.

Вместо того, чтобы сделать это в одной строке гораздо понятнее и без всяких извращений. Это не дело метода (тем более внешнего), что потом будут делать с возвращаемым им значением.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.09.2012, 14:22
Цитата Сообщение от romex Посмотреть сообщение
Это часто бывает костылем.
Обычно это называется соблюдением инкапсуляции. Следует всегда придерживаться принципа наименьших привилегий.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.09.2012, 14:22

Удалённые хуки. Когда для них нужно создавать *.dll, а когда необязательно?
Друзья! В туториалах Iczelion'а сказано просто: То тут то там вижу утверждения, что *.dll создавать необязательно, типа и так...

Дружественные функции. Наследование. Перегрузка функции
Здравствуйте, у меня проблема Не знаю куда Вставить имеющийся код(В какую строчку или строчки кода). Первый код это было 1 задание, 2-ой...

Дружественные функции
Здравствуйте, помогите добавить в программу дружественный класс. #include &lt;iostream&gt; #include &lt;string&gt; class Romb ...

Дружественные функции
Создать класс «студент» (его фамилия, имя, год рождения и год поступления). Написать: а) член-функцию печати информации о студенте; ...

Дружественные функции
Добрый день. Подскажите как правильно запихнуть данные код в тело дружественной функции. Моё задание:&quot;Напишите программу,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла 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-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru