Зачем нужна перегрузка операторов?
Можете написать код для большей усваимости
-
4Самая вредная примочка ООП. Чтобы непосвященные совсем запутались.– avp10 сен 2011 в 17:00
-
2avp, на java программируете? иногда писать MyFirstObject+=MySecondObject; удобнее, чем MyFirstObject=MyFirstObject.Add(MySecondObject); хоть реализуется оно практически одинково, даже возможно одно через другое– Spectre10 сен 2011 в 19:03
-
1(Оффтопя) К слову, ad-hoc полимфоризм (который, в частности, используется при перегрузке операторов) не является «примочкой» ООП и прекрасно существует безотносительно этой парадигмы. ООП — это, в основном, к полимфоризму через подтипы (который, обычно, и называют просто «полиморфизмом»).– drdaeman10 сен 2011 в 19:47
-
Сейчас еще остались не ООП языки в которых можно перегружать операции ??? Не помню, в АДЕ это есть ? Кстати, вообще-то я имел в виду перегружаемые пользователем операции, что к java не относится.– avp10 сен 2011 в 22:41
-
21. АДА -- первый международно стандартизованный язык ООП. 2. Смотрите перегрузку в haskell.– alexlz10 сен 2011 в 23:47
3 ответа
Чтобы Вы могли совершать с классами те же операции, что и со стандартными типами данных. Например:
class CMoneys
{
int iDol;
int iCen;
public:
CMoneys(int Dollars, int Cents)
{
iDol=Dollars;
iCen=Cents;
}
CMoneys(const CMoneys& Money);
//////Some code//////
CMoneys operator +(CMoneys mon)
{
return (iDol + Money.iDol, iCen + Money.iCen);
}
}
////////////// В Функции main /////////////
CMoneys M1(1, 2), M2(2, 3), M;
M = M1 + M2; /////////////// Понимаем, как М (M1.iDol + M2.iDol, M1.iCen + M2.iCen)
То есть благодаря перегрузке операторов мы можем выполнять со своими классами те же операции, что и со встроенными типами данных. О перегрузке хорошо написано Здесь
-
6
-
Why "madness"? You not like this programming style? I always write 'C' before class name, such as letter 'i' before int variable or 'ch' before char variable... 11 сен 2011 в 18:59
-
1
-
Не убедительно. Если Вы хороший программист, то Вы должны знать, когда класс, имя которого начинается на 'C' будет конфликтовать с разработанным Вами. Тем более, что в библиотеках языка С++ я ни разу не встречал классы, конфликтующие с моими собственными. И никто ещё из моего окружения их не встречал. Так что это дело сугуб личное. Вот если компилятор будет ругаться -- тогда да, тогда префикс надо будет сменить... 12 сен 2011 в 13:22
-
1
В некоторых случаях перегрузка все-таки удобнее своих функций с именами, особенно если подобные операторы введены вне программирования - например действия с полиномами (надеюсь, никто не будет спорить что два полинома можно сложить, вычесть и умножить и получить новый полином), сложение интенсивностей звука, действия с комплексными числами, приведенные выше действия с суммами денег или любыми другими величинами, записанными в виде X рублей Y копеек/ X футов Y дюймов и т.п.
-
Желательно бы увидеть пример кода для комплексных чисел... Сталоб понятнее)– Alerr11 сен 2011 в 10:52
-
2дай дураку стеклянный ...кхм, так он и ...кхм разобъёт и руки порежет. А если правильно и с умом использовать, то никаких проблем не должно возникать.– Spectre11 сен 2011 в 11:19
-
1Но я считаю, что настоящие ф-ции должны предшествовать операторам. Т.е. если необходисо сложение, то реализуйте ф-цию add(), а затем уже начинайте думать о перегрузке операторов. При этом перегруженный оператор + легко реализовать через уже написанную и, надеюсь, отлаженную ф-цию add().– gecube11 сен 2011 в 12:40
-
1@avp Так я и написал в некоторых случаях, перегрузкой не стоит сильно увлекаться и пихать её всюду, что, впрочем, верно и для любого действия. В подобных творениях не просили, но написать все через пень-колоду чтобы потом не найти маленькую ошибку можно и в самой простой процедурной программе без всякого ООП.– aknew11 сен 2011 в 13:07
-
3
Зачем нужна? А затем, что удобно. На самом деле, честно говоря, перегрузка операторов только запутывает.
Понятно откуда она растет - из обобщения принципа перегрузки функций, ведь перегруженные операторы - суть те же пользовательские функции. Ну, и программисты жуткие лентяи и не любят писать стопицот букв в коде программы.
Касательно того когда перегружать и зачем. Это гораздо более интересный вопрос. Могу сказать следующее: выгодно перегружать операторы = (практически обязательно, если пользовательский класс содержит указатели куда-либо и нужно корректно отрабатывать ситуацию создания копии существующего или временнего объекта класса), оператор -> (если реализуете класс с семантикой классического указателя), оператор [] (если реализуете класс массива или коллекции и есть необходимость доступа к элементу этой коллекции поиндексу), оператор () ( если реализуете концепцию функтора). К остальным перегрузкам следует относиться с осторожностью. Во-первых, сутьопераций должна быть ясна. Например, оператор + должен складывать объекты, а не вычитать или, скажем, считать налоги. Т.е. его стоит реализовывать для пользовательских строковых типов или численных типов. А вот для объектов бизнес-логики или моделирующих физические процессы использование этого оператора нерационально - становится неясно, что хотел сказать автор кода. Поэтому вызовы функций с говорящими именами - наш метод, правильный и надежный. Во-вторых, нет возможности переопределить приоритеты операторов. В третьих, не стоит плодить кучу перегрузок одного и того же оператора для случая разных комбинаций типов. Это вкупе с операторами приведения типов очень быстро приводит к бардаку. И может в некоторых случаях удивить компилятор, ну, и программиста тоже.
-
1Отличный ответ. Выводы для практики: 1) Не перегружайте операторы. 2) Избегайте чужого кода с перегруженными операторами (лучше перепишите его). 3) Не считайте, что функции с говорящими именами позволяют делать действительно понятные программы. Это иллюзия комментариев. Хороший комментарий говорит не о том, что делаем (это и так ясно из кода), а о том зачем именно это делаем. Иначе будут у вас плохо отлавливаемые при многолетнем сопровождении программ ошибочки.– avp11 сен 2011 в 10:31
-
перегрузку можно употреблять с математическими операторами или хотя бы широко известными типами такими как списки, карты, графы и.т.п а в остальном да хорошо делает код нечитабельным 13 фев 2018 в 1:51