LINUX.ORG.RU

Перегрузка операторов в C++

 , ,


1

4

В связи с переползанием на C++ хочу спросить (не холивара ради, а понимания для) - используется ли в реальных рабочих проектах перегрузка операторов? При первом приближении кажется, что это очень запутанная вещь, которая потенциально ведёт ко множеству ошибок, особенно, если в разработке принимает участие >1 человека.
Спасибо.


Везде где используется iostream.

потенциально ведёт ко множеству ошибок

Сравни этот же iostream с printf, что ведёт к большему числу ошибок.

anonymous
()

Перегрузка операторов = перегрузка функций, а перегрузка функций используется везде и постоянно.

Noob_Linux ★★★★
()

Везде используется. К ошибкам не ведет.

CatsCantFly
()

перегрузка операторов

Довольно широко. Куда приятней написать просто «+», чем заставлять пользоваться спец.функцией для сложения чего-то такого, что в предметной области просто должно складываться и всё тут.

Stahl ★★☆
()

Используется. На ней построены библиотеки ввода-вывода, итераторы, умные указатели и прочий std::function. Это не считая сложения строк, чисел и прочих вещей. Брат вроде жив.

KblCb ★★★★★
()
Ответ на: комментарий от KblCb

Я спрашивал скорее про пользовательскую перегрузку.
Профит предопределённых (>>, << и т.д.) вопросов не вызывает :)

hdclnr
() автор топика

А к чему тут тег полиморфизм? Разве то, что есть в C++ можно так назвать?

Deleted
()

Есть традиционные применения, вроде операторов разыменования для смартпоинтеров и итераторов или арифметики для чисел. Запутанно — это перегружать унарный & или возвращать void из operator<. В общем, думать надо, как это обычно бывает при работе с крестами.

const86 ★★★★★
()

Чаще всего, наверное - operator=(), operator()(), operator<() и operator==().

asaw ★★★★★
()

Конечно используется. Правда в большинстве случаев перегружается оператор присваивания в паре с конструктором копирования. Чуть реже - операторы сравнения ==, != и т.д. Остальное - по мере необходимости, где это повышает читабельность кода и удобство использования. Например в самописных строках, умных указателях, контейнерах, мат. либах. При наличии прямых рук ошибок не возникает.

archie
()
Ответ на: комментарий от hdclnr

Профит предопределённых (>>, << и т.д.) вопросов не вызывает :)

В каком месте они предопределенные? Ты их для своих типов точно так же перегружаешь, как если это был тот же +.

APPLE_OS_XX_OS_XY
()

Используется постоянно, особенно операторы сравнения, присваивания, отрицания. А вот арифметические и логические операторы требуется перегружать крайне редко. Лично мне в реальной работе особо не приходилось этим заниматься, хотя для самообразования в личных велосипедах делал это довольно часто. Хотя в существующих библиотеках (STL, Qt, etc) это тоже обычное дело - конкатенация строк, операции над векторами, множествами, элементами контейнеров, временем и т.п.

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 1)

переползанием на C++

Переползаешь с Java в которой переопределения нет?

tlx ★★★★★
()

Везде, где класс Money - это не typedef double.

E ★★★
()

При первом приближении кажется, что это очень запутанная вещь

Не стремись использовать все инструменты. В С++ их очень много. Если считаешь ненужной/сложной/опасной - не используй.

Я эту фичу использую, хотя и нечасто.

Чаще всего приходится следить на правильностью operator= и operator==. Притом в обоих вариантах: lvalue, rvalue. Остальные - реже, но бывало. Главное - наглядность кода.

Kroz ★★★★★
()

Конечно, так как может неимоверно повысить читаемость кода. Например, есть тип T, для которого определены арифметические операции. Это может быть, скажем, вектор скорости частицы. Если все сделано функциями, то выражение v1 + 2*(v2 - v3) придется писать как-то в виде plus(v1, times(2, minus(v2, v3))), что как-то не наглядно. Если же перегрузить, то будет писаться собственно как обычно.

hotpil ★★★★
()

используется ли в реальных рабочих проектах перегрузка операторов?

Да, конечно. И, порой, жалею о невозможности ввода собственных (a la Haskell).

Sectoid ★★★★★
()

используется ли в реальных рабочих проектах перегрузка операторов?

Сравнения и присваивание разве что. Всё остальное нужно разве что авторам библиотек.

tailgunner ★★★★★
()
Ответ на: комментарий от hotpil

Накидайте пожалуйста примеров софта, где используется вектор скорости частицы.

APPLE_OS_XX_OS_XY
()
Ответ на: комментарий от DarkEld3r

И какие именно хотелось добавить?

Да хотя бы >>=, =<<. И, нередко, в предметной области есть пара-тройка операций, которые плохо отображаются на существующие операторы. Можно, конечно, использовать +,-,/,%, etc, но это вносит путаницу в код.

Sectoid ★★★★★
()
Последнее исправление: Sectoid (всего исправлений: 1)
Ответ на: комментарий от anonymous

А в самом хаскеле есть возможность вводить свой синтаксис?

Вопрос точно ко мне? И что под этим подразумевается? Хотя подозреваю, что нет.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Просто Вы сказали, «как в Хаскеле», поэтому я подумал, что Вы пишите не Хаскеле.

А подразумевается например, было у меня 1 + 1 = 2, я переопределил + = -, стало 1 + 1 = 0, например

anonymous
()
Ответ на: комментарий от DarkEld3r

Ах, да, перепутал. Это Вы цитировали. Ладно забейте, неважно:)

anonymous
()

Применения:

  • >>, << в потоках I/O (iostream, fstream, stringstream)
  • +, -, * в классах векторов и матриц
  • / в boost::filesystem для склеивания путей: root_dir / dir / name
  • +, -, *, /, % в классах комплексных чисел, длинной арифметике и так далее
  • + в классах строк
  • -> и унарный * в классах умных указателей
quiet_readonly ★★★★
()

В связи с переползанием на C++

С какого языка переползаешь?

используется ли в реальных рабочих проектах перегрузка операторов?

Тут уже отвечали. Используется. Какие-то операторы перегружаются часто, какие-то редко.

это очень запутанная вещь

Все довольно просто.

потенциально ведёт ко множеству ошибок

Например? Это просто возможность использовать более привычный и удобный синтаксис. А так это обычные функции.

forCe
()
Ответ на: комментарий от anonymous

А в самом хаскеле есть возможность вводить свой синтаксис?

Как минимум есть возможность вводить свои операторы, задавая им определённые приоритет и ассоциативность. Ну а для совсем буйных есть TH.

nezamudich ★★
()
Ответ на: комментарий от anonymous

Сравни этот же iostream с printf, что ведёт к большему числу ошибок.

Аргумент принят, printf, действительно, ведет к меньшему числу ошибок.

Waterlaz ★★★★★
()

Без перегрузки опреаторов сравнения - не сможешь полноценно пользоваться контейнерами STL.

Nietzsche
()
Ответ на: комментарий от Waterlaz

А можно пример ошибок, связанных с перегрузкой операторов << >> для ввода/вывода? printf и подобные функции типобезопасными быть не могут(если не хардкодить их поддержку в компиляторе).

forCe
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.