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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте! Есть ли ситуации, когда без дружественных функций невозможно обойтись
или всегда можно заменить ее обычной функцией/методом? Если без нее обойтись нельзя, напишите пожалуйста пример) Т.е. по сути friend-функция просто избавляет от написания дополнительных функций для возврата тех значений, которые как бы и не обязательно возвращать, но из-за невозможности доступа в обычных функциях к скрытым полям класса приходится? И только?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2012, 22:20
Ответы с готовыми решениями:

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

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

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

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

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

Цитата Сообщение от PSIAlt Посмотреть сообщение
Но это какбы не мешает ему жить в классе к которому он имеет непосредственное отношение, а наверно даже помогает
чем меньше свойств и методов тем лучше
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
13.09.2012, 02:54 23
У Г. Шилдта в "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  [ТС] 24
Цитата Сообщение от 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.get_z());
}

?

Добавлено через 2 минуты
можно же сделать, чтобы он вернул вектор, т.е. написать один такой getVector, который возвращал бы сразу x,y,z...
0
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
13.09.2012, 10:37 25
Цитата Сообщение от Jupiter Посмотреть сообщение
Цитата Сообщение от PSIAlt Посмотреть сообщение
возвращать const
это спорный вопрос
Бывают конечно ситуации, но вообще вопрос слабо спорный. operator+ равно как и другие математические операторы должны возврачать const - это если по-хорошему делать. См. Мейерса
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
13.09.2012, 12:56 26
PSIAlt, Нет. Это спорный вопрос. Слишком спорный, чтобы советовать использовать возвращение констант.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
13.09.2012, 13:36 27
Цитата Сообщение от 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.get_z());
}
?
Добавлено через 2 минуты
можно же сделать, чтобы он вернул вектор, т.е. написать один такой getVector, который возвращал бы сразу x,y,z...
Это ж еще дольше. Ведь в конечном счёте, вектор и число, непосредственно, сложить или умножить нельзя. Всё равно, где-то придется распотрошить, до типов которые можно сложить. В итоги ещё и через промежуточный класс, обращаться. Это ж дольше?
0
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
13.09.2012, 13:52 28
Цитата Сообщение от ForEveR Посмотреть сообщение
PSIAlt, Нет. Это спорный вопрос. Слишком спорный, чтобы советовать использовать возвращение констант.
Секундочку, речь идет только про operator+, operator* и аналогичные.
Интересно, зачем может понадобиться поменять результат сложения? Можно взять результат и использовать его для каких-то других вычислений, сохранить или еще что. Никому же в голову не приходит что результат выражения 2+2 можно както менять?
Хотя, конечно если кто-то все еще пишет классы в которых operator+ делает что-то не имеющего ничего общего со сложенем, то да... Но надеюсь такие кодеры вымерли.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
13.09.2012, 14:22 29
Цитата Сообщение от PSIAlt Посмотреть сообщение
Секундочку, речь идет только про operator+, operator* и аналогичные.
Интересно, зачем может понадобиться поменять результат сложения? Можно взять результат и использовать его для каких-то других вычислений, сохранить или еще что. Никому же в голову не приходит что результат выражения 2+2 можно както менять?
Хотя, конечно если кто-то все еще пишет классы в которых operator+ делает что-то не имеющего ничего общего со сложенем, то да... Но надеюсь такие кодеры вымерли.
PSIAlt, думаю речь о бинарных операторах вообще, а не только для + и * , например для - тоже. И как вычесть если не дистрибутивная операция? Надо же 10-a получить, а не а-10. Конечно можно объяснить юзеру, что Ваш класс это делает так: -(a-10), но зачем? А если у Вас перегружена операция > , то и < перегружать (?) или дать возможность сравнить большую матрицу с числом так: if(10>a). Пусть живут разные кодеры.
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.09.2012, 17:04 30
Цитата Сообщение от PSIAlt Посмотреть сообщение
Никому же в голову не приходит что результат выражения 2+2 можно както менять?
Да, думаю, дело больше в том, что в Си++ есть такая штука как const-qualified методы. И если в результате сложения надо вернуть класс, который трогать нельзя, то придётся копировать результат сложения в переменную, чтобы вызывать его не-const метод, но который хоть фактически может быть const (то есть не изменять состояние объекта), но cv-правила дадут по рукам за попытку его вызвать. А взять и дописать ему const нельзя. Разве что снимать constness с помощью const_cast, что тоже не ахти.

Вместо того, чтобы сделать это в одной строке гораздо понятнее и без всяких извращений. Это не дело метода (тем более внешнего), что потом будут делать с возвращаемым им значением.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.09.2012, 14:22 31
Цитата Сообщение от romex Посмотреть сообщение
Это часто бывает костылем.
Обычно это называется соблюдением инкапсуляции. Следует всегда придерживаться принципа наименьших привилегий.
0
15.09.2012, 14:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2012, 14:22
Помогаю со студенческими работами здесь

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

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

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

Дружественные функции
Добрый день. Подскажите как правильно запихнуть данные код в тело дружественной функции. Моё...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru