С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
#1

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

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

Здравствуйте! Есть ли ситуации, когда без дружественных функций невозможно обойтись
или всегда можно заменить ее обычной функцией/методом? Если без нее обойтись нельзя, напишите пожалуйста пример) Т.е. по сути friend-функция просто избавляет от написания дополнительных функций для возврата тех значений, которые как бы и не обязательно возвращать, но из-за невозможности доступа в обычных функциях к скрытым полям класса приходится? И только?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2012, 22:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос дружественные функции в C++. Когда без них невозможно? (C++):

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

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

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

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

Дружественные функции - C++
День добрый. class Distance { private: int fut; int inch; public: Distance():fut(0),inch(0){}; Distance(int f,int...

Дружественные функции - C++
Всем привет,объясните пожалуйста,почему мой код не выводит информацию из private, даже если я указал как friend нужную функцию(наверное)....

30
I.M.
566 / 549 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
12.09.2012, 22:27 #2
Например, с помощью friend перегружают оператор ввода/вывода в поток
пример - www.cyberforum.ru/cpp/thread97114.html
0
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
12.09.2012, 22:35 #3
Например когда ты хочешь перегрузить какой-нибудь оператор, но слева стоит один из стандартных классов, например std::istream. Т.к. первый ты не можешь изменить, а из твоего operator<< вызываться не будет. В таких случаях нужна свободная функция operator<<. Дальше, если ты хочешь чтобы она к примеру работала быстрее - возможно есть смысл ослабить для нее энкапсуляцию и позволить лазить в приватные части и складывать данные.
0
romex
45 / 45 / 4
Регистрация: 11.04.2010
Сообщений: 223
12.09.2012, 22:40 #4
Дружественные функции - всего лишь одна из возможностей C++. Можете ими не пользоваться, но они часто делают код изящнее.
0
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
12.09.2012, 22:45  [ТС] #5
Цитата Сообщение от I.M. Посмотреть сообщение
Например, с помощью friend перегружают оператор ввода/вывода в поток
пример
В перегрузке <<,>> можно обойтись и обычной функцией, а обращение к скрытым полям в ней сделать посредством методов класса

Добавлено через 1 минуту
Цитата Сообщение от PSIAlt Посмотреть сообщение
Например когда ты хочешь перегрузить какой-нибудь оператор, но слева стоит один из стандартных классов, например std::istream. Т.к. первый ты не можешь изменить, а из твоего operator<< вызываться не будет. В таких случаях нужна свободная функция operator<<. Дальше, если ты хочешь чтобы она к примеру работала быстрее - возможно есть смысл ослабить для нее энкапсуляцию и позволить лазить в приватные части и складывать данные.
Цитата Сообщение от romex Посмотреть сообщение
Дружественные функции - всего лишь одна из возможностей C++. Можете ими не пользоваться, но они часто делают код изящнее.
Ок. Т.е. критичной необходимости в них нет?
0
romex
45 / 45 / 4
Регистрация: 11.04.2010
Сообщений: 223
12.09.2012, 22:48 #6
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Ок. Т.е. критичной необходимости в них нет?
Критичной необходимости нет и для, например, исключений, но это удобно.
В перегрузке <<,>> можно обойтись и обычной функцией, а обращение к скрытым полям в ней сделать посредством методов класса
Это часто бывает костылем.
1
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
12.09.2012, 22:58 #7
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
В перегрузке <<,>> можно обойтись и обычной функцией, а обращение к скрытым полям в ней сделать посредством методов класса
Это открывает те самые методы для всей программы вообще.

Конечно, можно обойтись и без того, и без другого. Раньше люди и на чистом С писали, в том числе классы реализовывали...
1
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
12.09.2012, 23:08 #8
А как реализовать operator+, если он например складывает два объекта одного класса?

Запихать в класс будет неправильным - это не есть часть класса, это некая фукнция которая производит операции над двумя обхектами этого класса и возращает третий такой.
0
romex
45 / 45 / 4
Регистрация: 11.04.2010
Сообщений: 223
12.09.2012, 23:12 #9
Цитата Сообщение от _stealth_ Посмотреть сообщение
А как реализовать operator+, если он например складывает два объекта одного класса?

Запихать в класс будет неправильным - это не есть часть класса, это некая фукнция которая производит операции над двумя обхектами этого класса и возращает третий такой.
В std::string сделано именно так.
0
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
12.09.2012, 23:14 #10
Цитата Сообщение от _stealth_ Посмотреть сообщение
А как реализовать operator+, если он например складывает два объекта одного класса?

Запихать в класс будет неправильным - это не есть часть класса, это некая фукнция которая производит операции над двумя обхектами этого класса и возращает третий такой.
Запихать внутрь какраз самое то. Даже неявное преобразование помогает(если конструктор не explicit), например:
C++
1
2
std::string str("Hello");
str = str + " world!";
Другое дело когда наоборот, то есть
C++
1
"Hello" + std::string("world!");
-- в таком случае придется делать внешнюю функцию
C++
1
std::string operator+(std::string s1, std::string s2);
0
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
12.09.2012, 23:20 #11
Цитата Сообщение от romex Посмотреть сообщение
В std::string сделано именно так.
Да, и Страуступ этого не коменнтирует
Но, на сколько я его понял, нужно сделать пространство имен, в нем класси о дружественные функции, как операторы (11.5 и 11.5.2 у Страуступа). Думаю это логично.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
12.09.2012, 23:20 #12
Цитата Сообщение от PSIAlt Посмотреть сообщение
Это открывает те самые методы для всей программы вообще.
Вполне можно сделать только два метода: serialize() и deserialize(), такие себе мега-get() и мега-set(). И operator<<() с operator>>() внешними функциями пишутся безо всяких друзей.
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
12.09.2012, 23:21 #13
Вместо доступа дружественной функции к нутру класса всегда можно сделать геттер и сеттер.
Я почти уверен, что компилятор как-нибудь оптимизирует код, что ты не заметишь разницы между получением доступа по геттеру или через прямой доступ (.).
0
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
12.09.2012, 23:24 #14
Цитата Сообщение от Герц Посмотреть сообщение
Я почти уверен, что компилятор как-нибудь оптимизирует код, что ты не заметишь разницы между получением доступа по геттеру или через прямой доступ (.).
Почти уверен что ребзя из других отделов придумают как бы это посмешнее использовать=)
0
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
12.09.2012, 23:24 #15
Цитата Сообщение от PSIAlt Посмотреть сообщение
Запихать внутрь какраз самое то. Даже неявное преобразование помогает(если конструктор не explicit), например:
C++
1
2
std::string str("Hello");
str = str + " world!";
Другое дело когда наоборот, то есть
C++
1
"Hello" + std::string("world!");
-- в таком случае придется делать внешнюю функцию
C++
1
std::string operator+(std::string s1, std::string s2);
Ну, а разве в первом случаи внешний опрератор не справится? Этот код расшифруеся
C++
1
2
3
some = str + " word";
some = str + std::string(" word");
some = operator+(str, std::string(" word"));
0
12.09.2012, 23:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2012, 23:24
Привет! Вот еще темы с ответами:

дружественные функции - C++
Имеется следующий код, содержащий дружественную функцию: mt.h #ifndef MT_H_ #define MT_H_ class Time { private: int...

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

дружественные функции - C++
Тема: дружественные функции Напишите программу обращения слова. Помогите решить на С++

Дружественные функции - C++
Задание: создать дружественные функции . Вроде всё работает, но возможно я неправильно что то написала. Почему так часто вызывается...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.