Если я перегружаю оператор '>', должен ли я перегружать оператор '‹' для аргументов (const Message &, const Message &)?
да. Фактически, в большинстве кодов принято предпочесть использование <
, а не >
(не спрашивайте меня, почему, вероятно, исторически). Но в более общем плане всегда перегружайте полный набор связанных операторов; в вашем случае это, вероятно, также будет ==
, !=
, <=
и >=
.
(В следующем коде вызывается оператор> для объекта message1 или оператор ‹объекта message2?)
Он всегда вызывает то, что находит в коде. Для компилятора C ++ нет абсолютно никакой связи между >
и <
. Для нас они выглядят одинаково, но компилятор видит два совершенно разных, не связанных друг с другом символа. Таким образом, нет двусмысленности: компилятор вызывает то, что видит.
Должен ли он быть объявлен как функция-член?
Нет. На самом деле, ее лучше не объявлять как функцию-член. Объявление его как функции-члена означает, что первый аргумент (то есть левая часть выражения) действительно должен быть объектом Message
, а не объектом, который неявно преобразуется в Message
.
Чтобы понять это, рассмотрим следующий случай:
struct RealFraction {
RealFraction(int x) { this.num = x; this.den = 1; }
RealFraction(int num, int den) { normalize(num, den); }
// Rest of code omitted.
bool operator <(RealFraction const& rhs) {
return num * rhs.den < den * rhs.num;
}
};
Теперь вы можете написать следующее сравнение:
int x = 1;
RealFraction y = 2;
if (y < x) …
но вы не можете написать следующее:
if (x < y) …
хотя существует неявное преобразование из int
в RealFraction
(с использованием первого конструктора).
Если, с другой стороны, вы использовали функцию, не являющуюся членом, для реализации оператора, оба сравнения будут работать, потому что C ++ будет знать, что нужно вызывать неявный конструктор для первого аргумента.
person
Konrad Rudolph
schedule
07.11.2009