оператор, перегружающий C++

При перегрузке операторов, это необходимый для перегрузки> = <= и! =?

Кажется, что это было бы умно, чтобы C++ звонил! оператор = для! =!> для оператора <= и! <для оператора> =.

Имеет место, что, или действительно ли необходимо перегрузить каждую функцию?

5
задан finiteloop 6 February 2010 в 22:47
поделиться

9 ответов

Да, это необходимо, если вы хотите, чтобы все они работали так, как вы хотите.

C ++ не требует какой-либо определенной семантики для большинства перегружаемых операторов. Единственное, что исправлено, - это общий синтаксис оператора (в том числе унарный или двоичный и такие вещи, как приоритет и ассоциативность). Это сразу означает, что фактическая функциональность, которую вы реализуете в своей перегрузке, может быть абсолютно произвольной. В общем случае может не быть какой-либо значимой связи между тем, что делает оператор == , и тем, что делает оператор ! = . Оператор == может записывать данные в файл, а оператор ! = может сортировать массив.

Хотя такая произвольная перегрузка операторов, безусловно, не является хорошей практикой программирования, язык C ++ не может ничего предполагать. Так что нет, он не может и не будет автоматически использовать ! == комбинация вместо ! = или ! > комбинация вместо <= .

2
ответ дан 18 December 2019 в 11:56
поделиться

Нет, вам нужно только перегрузить operator == и operator <, об остальном позаботится стандартная библиотека :)

(EDIT: см. Использование пространства имен std :: rel_ops;)

{{1} }
2
ответ дан 18 December 2019 в 11:56
поделиться

Есть несколько ярлыков , которые вы можете использовать, например CRTP, чтобы они автоматически вводили (см. Различные классы сравнения) в ваш класс.

0
ответ дан 18 December 2019 в 11:56
поделиться

Здесь я буду придерживаться точки зрения меньшинства. Если вы уже используете ускорение, то использование операторов ускорения не представляет особого труда. Это может быть правильный и проверенный способ сделать что-то, но добавление зависимости от повышения только для операторов - излишнее.

Можно писать сложные программы на C ++ без ускорения (что лично я считаю неприятным с эстетической точки зрения) и, таким образом, сохранять простоту (глупо), чтобы ответить на вопрос OP, , если вы перегрузите operator == , вам также следует перегрузить оператор ! = . То же самое верно для <, > , ++ и т. Д.

3
ответ дан 18 December 2019 в 11:56
поделиться

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

То, что C ++ не предоставляет этого автоматически, имеет смысл, так как, например, можно придать совершенно разные значения <и> (хотя часто это было бы плохой идеей).

7
ответ дан 18 December 2019 в 11:56
поделиться

Да! Все они технически разные операторы. Компиляторы C ++ по своей сути не являются механизмами вывода, они являются парсерами / компиляторами. Они сделают ровно столько, сколько вы скажете. http://www.parashift.com/c++-faq-lite/operator-overloading.html , http: //en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

0
ответ дан 18 December 2019 в 11:56
поделиться

Да, необходимо перегружать те операторы, которые вы хотите использовать при их определении - C++ не примет решение, которое вы описали выше; однако, имейте в виду, что если причина перегрузки - сортировка вашего класса, то вам нужно переопределить только те операторы, которые используются процедурой сортировки. В случае с алгоритмом сортировки RTL вам нужно переопределить только < и =.

1
ответ дан 18 December 2019 в 11:56
поделиться

C ++ как язык не определяет никаких операторов в терминах каких-либо других перегруженных операторов. Тот факт, что у вас есть operator + , не означает, что вы получаете operator + = бесплатно (в отличие от Ruby и Scala). Наличие оператора < и == не означает, что вы получаете <= бесплатно. Тот факт, что у вас есть оператор == , не означает, что вы получаете ! = бесплатно (в отличие от Ruby и Scala). Тот факт, что у вас есть унарный оператор * (унарный), не означает, что вы получаете оператор -> бесплатно.

std :: relops (если импортирован правильно) и предоставляют определения по умолчанию, а Boost предоставляет некоторые сочетания, которые определяют все операторы сравнения в терминах < и == .

0
ответ дан 18 December 2019 в 11:56
поделиться

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

0
ответ дан 18 December 2019 в 11:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: