Balance tmp(lhs.val_ + rhs.val_);
return(tmp);
}
Она принимает два объекта типа const Balance
Balance
должен объявить эту функцию как friend
.class Balance {
// Здесь требуется видеть частные данные
friend Balance operator+(const Balance& lhs, const Balance& rhs);
// ...
Все что объявляется, как friend
const
, чтобы случайно не изменить их содержимое.Это почти все, что от вас требуется, но есть еще кое-что, что требуется сделать. Пользователи класса могут создать выражение, аналогичное такому.total = savings + 500.00;
Для кода из примера 8.15 это выражение будет работать, так как компилятор увидит, что класс Balance
Balance
, используя в конструкторе число 500.00. Однако здесь есть две проблемы: накладные расходы на создание временного объекта и отсутствие в классе Balance
конструктора для всех возможных аргументов, которые могут использоваться в операторе сложения. Скажем, имеется класс с именем Transaction
, который представляет сумму кредита или дебета. Пользователь Balance
может сделать что-то подобное этому.Transaction tx(-20.00);
total = savings + tx;
Этот код не скомпилируется, так как не существует оператора, который бы складывал объекты Ваlance
Transaction
. Так что создайте такой.Balance operator+(const Balance& lhs, const Transaction& rhs) {
Balance tmp(lhs.val_ + Transaction.amount_);
return(tmp);
}
Однако необходимо сделать еще кое-что. Этот оператор также требуется объявить как friend
Transaction
, а кроме того, нужно создать идентичную версию этого оператора, которая бы принимала аргументы в обратном порядке, что позволит использовать аргументы сложения в любом порядке и сделает эту операцию коммутативной, т.е. x+y == y+x
.Balance operator+(const Transaction& lhs, const Balance& rhs) {
Balance tmp(lhs.amount_ + rhs.val_);
return(tmp);
}
По той же причине и чтобы избежать создания дополнительного временного объекта при автоматическом вызове конструктора, создайте собственные версии операторов для работы с любыми другими типами переменных.
Balance operator+(double lhs, const Balance& rhs) {
Balance tmp(lhs + rhs.val_);
return(tmp);
}
Balance operator+(const Balance& lhs, double rhs) {
Balance tmp(lhs.val_ + rhs);
return(tmp);
}
И снова требуется создать по две версии каждого, чтобы позволить запись, как здесь.
total = 500.00 + checking;
В этом случае создание временного объекта относительно недорого. Но временный объект — это временный объект, и в простых выражениях он не создаст заметных накладных расходов, но такие незначительные оптимизации всегда следует рассматривать в более широком контексте — что, если в результате инкремента каждого элемента vector
В этот момент уместно спросить, почему для этих операторов мы должны создавать отдельные функции и не можем использовать методы, как это делается для присвоения? На самом деле вы