2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
|
|
1 | |
дружественные функции в C++. Когда без них невозможно?12.09.2012, 22:20. Показов 4197. Ответов 30
Метки нет (Все метки)
Здравствуйте! Есть ли ситуации, когда без дружественных функций невозможно обойтись
или всегда можно заменить ее обычной функцией/методом? Если без нее обойтись нельзя, напишите пожалуйста пример) Т.е. по сути friend-функция просто избавляет от написания дополнительных функций для возврата тех значений, которые как бы и не обязательно возвращать, но из-за невозможности доступа в обычных функциях к скрытым полям класса приходится? И только?
0
|
12.09.2012, 22:20 | |
Ответы с готовыми решениями:
30
Когда стоит использовать класс, а когда лучше обойтись без них? Бывает ли ситуация, когда невозможно решить задачу без безымянных namespaces? Протестировать функции заданий 13 и 14 на наличие в них операторов возврата как с выражением ,так и без него Удалённые хуки. Когда для них нужно создавать *.dll, а когда необязательно? |
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
|
|
13.09.2012, 01:45 | 21 |
Даже больше: он вообще должен быть const, принимать const и возвращать const xD Но это какбы не мешает ему жить в классе к которому он имеет непосредственное отношение, а наверно даже помогает
0
|
Комп_Оратор)
|
|
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 |
под внешней разумеется
cName & operator+(const cName & obj1, const cName & obj2) { return cName(obj.get_val() + obj.get_val()); } ? Если да, то почему только через экземпляр справа? Три раза вызвать, в смысле имеется три поля в классе 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 |
Бывают конечно ситуации, но вообще вопрос слабо спорный. operator+ равно как и другие математические операторы должны возврачать const - это если по-хорошему делать. См. Мейерса
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
13.09.2012, 12:56 | 26 |
PSIAlt, Нет. Это спорный вопрос. Слишком спорный, чтобы советовать использовать возвращение констант.
0
|
Комп_Оратор)
|
||||||
13.09.2012, 13:36 | 27 | |||||
Пример же для бинарной операции со встроенным типом слева от оператора:
0
|
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
|
|
13.09.2012, 13:52 | 28 |
Секундочку, речь идет только про operator+, operator* и аналогичные.
Интересно, зачем может понадобиться поменять результат сложения? Можно взять результат и использовать его для каких-то других вычислений, сохранить или еще что. Никому же в голову не приходит что результат выражения 2+2 можно както менять? Хотя, конечно если кто-то все еще пишет классы в которых operator+ делает что-то не имеющего ничего общего со сложенем, то да... Но надеюсь такие кодеры вымерли.
0
|
Комп_Оратор)
|
|
13.09.2012, 14:22 | 29 |
PSIAlt, думаю речь о бинарных операторах вообще, а не только для + и * , например для - тоже. И как вычесть если не дистрибутивная операция? Надо же 10-a получить, а не а-10. Конечно можно объяснить юзеру, что Ваш класс это делает так: -(a-10), но зачем? А если у Вас перегружена операция > , то и < перегружать (?) или дать возможность сравнить большую матрицу с числом так: if(10>a). Пусть живут разные кодеры.
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
13.09.2012, 17:04 | 30 |
Да, думаю, дело больше в том, что в Си++ есть такая штука как const-qualified методы. И если в результате сложения надо вернуть класс, который трогать нельзя, то придётся копировать результат сложения в переменную, чтобы вызывать его не-const метод, но который хоть фактически может быть const (то есть не изменять состояние объекта), но cv-правила дадут по рукам за попытку его вызвать. А взять и дописать ему const нельзя. Разве что снимать constness с помощью const_cast, что тоже не ахти.
Вместо того, чтобы сделать это в одной строке гораздо понятнее и без всяких извращений. Это не дело метода (тем более внешнего), что потом будут делать с возвращаемым им значением.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
15.09.2012, 14:22 | 31 |
Обычно это называется соблюдением инкапсуляции. Следует всегда придерживаться принципа наименьших привилегий.
0
|
15.09.2012, 14:22 | |
15.09.2012, 14:22 | |
Помогаю со студенческими работами здесь
31
Дружественные функции. Наследование. Перегрузка функции Дружественные функции Дружественные функции Дружественные функции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |