При перегрузке операторов необходимо перегружать >= ‹= и !=?
Кажется, что для С++ было бы разумно вызывать !operator= для !=, !> для operator‹= и !‹ для operator>=.
Так ли это, или необходимо перегружать каждую функцию?
При перегрузке операторов необходимо перегружать >= ‹= и !=?
Кажется, что для С++ было бы разумно вызывать !operator= для !=, !> для operator‹= и !‹ для operator>=.
Так ли это, или необходимо перегружать каждую функцию?
Да, это необходимо, если вы хотите, чтобы все они работали так, как вы хотите, чтобы они работали.
C++ не навязывает какую-либо конкретную семантику большинству перегружаемых операторов. Единственное, что исправлено, — это общий синтаксис оператора (включая унарность или бинарность, а также такие вещи, как приоритет и ассоциативность). Это сразу означает, что реальная функциональность, которую вы реализуете в своей перегрузке, может быть абсолютно произвольной. В общем случае может не быть никакой значимой связи между тем, что делает оператор ==
, и тем, что делает оператор !=
. Оператор ==
может записывать данные в файл, а оператор !=
может сортировать массив.
Хотя перегрузка операторов таким произвольным образом, безусловно, не является хорошей практикой программирования, язык C++ не может ничего предполагать. Так что нет, он не может и не будет автоматически использовать комбинацию ! ==
вместо !=
или комбинацию ! >
вместо <=
.
==
и !=
довольно надуманный. Более реалистичным был бы класс, представляющий объект SQL, где вам приходится иметь дело со специальной семантикой NULL
.
- person dan04; 02.07.2010
операторы Boost могут быть что ты ищешь. Они выведут большинство ваших операторов на основе нескольких фундаментальных.
То, что С++ не обеспечивает это автоматически, имеет смысл, поскольку, например, можно было бы придать совершенно разные значения ‹ и > (хотя часто это было бы плохой идеей).
Я собираюсь принять точку зрения меньшинства здесь. Если вы уже используете boost, то использование операторов boost не так уж и сложно. Это может быть правильным и проверенным способом сделать что-то, но добавление зависимости повышения только для операторов — это излишество.
Можно писать сложные программы на C++ без ускорения (что я лично нахожу эстетически неприятным), и поэтому Keep It Simple (глупо), чтобы ответить на вопрос ОП, если вы перегружаете operator ==
, вы также должны перегружать operator !=
. То же самое верно для <
, >
, ++
и т. д.
operator ==
и не инвертирует результат, когда !=
не определено. Не спорю, что есть автоматический способ сделать это.
- person Igor Zevaka; 07.02.2010
Нет, вам нужно только перегрузить оператор == и оператор ‹, об остальном позаботится стандартная библиотека :)
(EDIT: см. использование пространства имен std::rel_ops;)
Да, необходимо перегружать любые операторы, которые вы хотите использовать, как вы их определяете - C++ не примет решение, которое вы описали выше; однако имейте в виду, что если причиной перегрузки является сортировка вашего класса, вам нужно только переопределить операторы, используемые процедурой сортировки. В случае алгоритма сортировки RTL вам нужно переопределить только ‹ и =.
Да! Это технически разные операторы. Компиляторы C++ по своей сути не являются механизмами вывода, они являются синтаксическими анализаторами/компиляторами. Они сделают ровно столько, сколько вы скажете. http://www.parashift.com/c++-faq-lite/operator-overloading.html, http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
Есть несколько горячих клавиш, которые вы можете использовать, например как CRTP, чтобы получать их автоматически добавлено (см. различные классы сравнения) в ваш класс.
C++ как язык не определяет какой-либо оператор в терминах любого другого перегруженного оператора. То, что у вас есть operator+
, не означает, что вы получаете operator+=
бесплатно (в отличие от Ruby и Scala). То, что у вас есть операторы <
и ==
, не означает, что вы получаете <=
бесплатно. То, что у вас есть оператор ==
, не означает, что вы получаете !=
бесплатно (в отличие от Ruby и Scala). То, что у вас есть унарный operator *
(унарный), не означает, что вы получаете operator ->
бесплатно.
std::relops
(если они импортированы правильно) и предоставляют определения по умолчанию, а Boost предоставляет некоторые примеси, которые определяют все операторы сравнения с точки зрения <
и ==
.
Вы можете использовать перегрузку для использования определенных пользователем имен. Перегрузка оператора означает использование одного и того же оператора для выполнения операций с разными элементами, не относящимися к этой категории. Перегрузка функций означает использование одного и того же имени функции, но разных аргументов, чтобы преодолеть накладные расходы, когда одна и та же функция вызывается во время цикла.