4

Зачем нужна перегрузка операторов?
Можете написать код для большей усваимости

5
  • 4
    Самая вредная примочка ООП. Чтобы непосвященные совсем запутались.
    – avp
    10 сен 2011 в 17:00
  • 2
    avp, на java программируете? иногда писать MyFirstObject+=MySecondObject; удобнее, чем MyFirstObject=MyFirstObject.Add(MySecondObject); хоть реализуется оно практически одинково, даже возможно одно через другое
    – Spectre
    10 сен 2011 в 19:03
  • 1
    (Оффтопя) К слову, ad-hoc полимфоризм (который, в частности, используется при перегрузке операторов) не является «примочкой» ООП и прекрасно существует безотносительно этой парадигмы. ООП — это, в основном, к полимфоризму через подтипы (который, обычно, и называют просто «полиморфизмом»).
    – drdaeman
    10 сен 2011 в 19:47
  • Сейчас еще остались не ООП языки в которых можно перегружать операции ??? Не помню, в АДЕ это есть ? Кстати, вообще-то я имел в виду перегружаемые пользователем операции, что к java не относится.
    – avp
    10 сен 2011 в 22:41
  • 2
    1. АДА -- первый международно стандартизованный язык ООП. 2. Смотрите перегрузку в haskell.
    – alexlz
    10 сен 2011 в 23:47

3 ответа 3

7

Чтобы Вы могли совершать с классами те же операции, что и со стандартными типами данных. Например:

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)

То есть благодаря перегрузке операторов мы можем выполнять со своими классами те же операции, что и со встроенными типами данных. О перегрузке хорошо написано Здесь

9
  • 6
    Stop Cclass madness!
    – gecube
    10 сен 2011 в 23:46
  • 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...
    – 3JIoi_Hy6
    11 сен 2011 в 18:59
  • 1
    jelovic.com/articles/stupid_naming.htm
    – gecube
    11 сен 2011 в 19:30
  • Не убедительно. Если Вы хороший программист, то Вы должны знать, когда класс, имя которого начинается на 'C' будет конфликтовать с разработанным Вами. Тем более, что в библиотеках языка С++ я ни разу не встречал классы, конфликтующие с моими собственными. И никто ещё из моего окружения их не встречал. Так что это дело сугуб личное. Вот если компилятор будет ругаться -- тогда да, тогда префикс надо будет сменить...
    – 3JIoi_Hy6
    12 сен 2011 в 13:22
  • 1
    Классы в С??? Кажется, я что-то пропустил, когда учил этот язык
    – aknew
    12 сен 2011 в 13:29
4

В некоторых случаях перегрузка все-таки удобнее своих функций с именами, особенно если подобные операторы введены вне программирования - например действия с полиномами (надеюсь, никто не будет спорить что два полинома можно сложить, вычесть и умножить и получить новый полином), сложение интенсивностей звука, действия с комплексными числами, приведенные выше действия с суммами денег или любыми другими величинами, записанными в виде X рублей Y копеек/ X футов Y дюймов и т.п.

9
  • Желательно бы увидеть пример кода для комплексных чисел... Сталоб понятнее)
    – Alerr
    11 сен 2011 в 10:52
  • 2
    дай дураку стеклянный ...кхм, так он и ...кхм разобъёт и руки порежет. А если правильно и с умом использовать, то никаких проблем не должно возникать.
    – Spectre
    11 сен 2011 в 11:19
  • 1
    Но я считаю, что настоящие ф-ции должны предшествовать операторам. Т.е. если необходисо сложение, то реализуйте ф-цию add(), а затем уже начинайте думать о перегрузке операторов. При этом перегруженный оператор + легко реализовать через уже написанную и, надеюсь, отлаженную ф-цию add().
    – gecube
    11 сен 2011 в 12:40
  • 1
    @avp Так я и написал в некоторых случаях, перегрузкой не стоит сильно увлекаться и пихать её всюду, что, впрочем, верно и для любого действия. В подобных творениях не просили, но написать все через пень-колоду чтобы потом не найти маленькую ошибку можно и в самой простой процедурной программе без всякого ООП.
    – aknew
    11 сен 2011 в 13:07
  • 3
    @Alerr например, вот: dmtsoft.ru/bn/370/as/oneaticleshablon
    – aknew
    11 сен 2011 в 13:14
3

Зачем нужна? А затем, что удобно. На самом деле, честно говоря, перегрузка операторов только запутывает.

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

Касательно того когда перегружать и зачем. Это гораздо более интересный вопрос. Могу сказать следующее: выгодно перегружать операторы = (практически обязательно, если пользовательский класс содержит указатели куда-либо и нужно корректно отрабатывать ситуацию создания копии существующего или временнего объекта класса), оператор -> (если реализуете класс с семантикой классического указателя), оператор [] (если реализуете класс массива или коллекции и есть необходимость доступа к элементу этой коллекции поиндексу), оператор () ( если реализуете концепцию функтора). К остальным перегрузкам следует относиться с осторожностью. Во-первых, сутьопераций должна быть ясна. Например, оператор + должен складывать объекты, а не вычитать или, скажем, считать налоги. Т.е. его стоит реализовывать для пользовательских строковых типов или численных типов. А вот для объектов бизнес-логики или моделирующих физические процессы использование этого оператора нерационально - становится неясно, что хотел сказать автор кода. Поэтому вызовы функций с говорящими именами - наш метод, правильный и надежный. Во-вторых, нет возможности переопределить приоритеты операторов. В третьих, не стоит плодить кучу перегрузок одного и того же оператора для случая разных комбинаций типов. Это вкупе с операторами приведения типов очень быстро приводит к бардаку. И может в некоторых случаях удивить компилятор, ну, и программиста тоже.

2
  • 1
    Отличный ответ. Выводы для практики: 1) Не перегружайте операторы. 2) Избегайте чужого кода с перегруженными операторами (лучше перепишите его). 3) Не считайте, что функции с говорящими именами позволяют делать действительно понятные программы. Это иллюзия комментариев. Хороший комментарий говорит не о том, что делаем (это и так ясно из кода), а о том зачем именно это делаем. Иначе будут у вас плохо отлавливаемые при многолетнем сопровождении программ ошибочки.
    – avp
    11 сен 2011 в 10:31
  • перегрузку можно употреблять с математическими операторами или хотя бы широко известными типами такими как списки, карты, графы и.т.п а в остальном да хорошо делает код нечитабельным
    – user184868
    13 фев 2018 в 1:51

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.