Хотя я чувствую, что предыдущие ответы достаточно хороши, я считаю, что необходимы некоторые разъяснения.
Операторы приходят (обычно) в двух вариантах
Первая - это функции, не являющиеся членами, вторая - функция-член, параметром которой является «правый операнд» операции и которая обычно возвращает текущий измененный объект.
Например, представьте, что есть оператор §
для класса T
. Он может быть записан как функция, не являющаяся членом :
T operator § (const T & lhs, const T & rhs)
{
T result ;
// do the lhs § rhs operation, and puts the result into "result"
return result ;
}
или как функция-член :
T & T::operator § (const T & rhs)
{
// do the "this § rhs" operation, and puts the result into "this"
return *this ;
}
или даже (очень необычно) в качестве другой функции-члена :
T T::operator § (const T & rhs) const
{
T result ;
// do the "this § rhs" operation, and puts the result into "result"
return result ;
}
Обычно вы предпочитаете функцию, не являющуюся членом, хотя бы потому, что вы не должны объявлять ее другом. Таким образом, использование функции non-member non-friend улучшает инкапсуляцию вашего объекта.
Отказ от ответственности: есть и другие варианты, но я ограничиваю себя арифметическими операторами, такими как +
, *
, /
, -
и т. Д., А также оператором "заслуживающий доверия" прототипы.
Проанализируйте ваше использование оператора
В случае +
:
- Каждый операнд должен быть постоянным, потому что
a = b + c
не должен изменяться b
и c
.
- Вы можете накапливать
+
, как в a = b + c + d + e
, поэтому временные должны существовать.
T operator § (const T & lhs, const T & rhs)
{
T result ;
// do the lhs § rhs operation, and puts the result into "result"
return result ;
}
В случае +=
:
- Вы знаете, что левый операнд A (из A + = B) будет изменен.
- Вы знаете, что левый операнд A (из A + = B) является его собственным результатом.
Так что вы должны использовать:
T & T::operator += (const T & rhs)
{
// do the "this § rhs" operation, and puts the result into "this"
return *this ;
}
Как всегда, преждевременная оптимизация - корень всего зла
Я видел такой код в рабочем коде, так что действительно происходит:
T & operator + (const T & lhs, const T & rhs)
{
static T result ; // result is STATIC !!!!
// do the lhs + rhs operation, and puts the result into "result"
return result ;
}
Автор надеялся сэкономить один временный. С этим типом кода написание a = b + c + d
приводит к интересным (и неправильным) результатам.
^ _ ^
Последнее, но не менее важное
Я написал список прототипов перегрузки операторов на этой странице . Страница все еще находится в стадии разработки, но ее основное использование (простое копирование / вставка рабочих прототипов) может быть весьма полезным ...