#include <iostream>
// =========================================================================
// ВАРИАНТ 1: Операторы реализованы как функции-члены класса
// =========================================================================
class MemberReal {
private:
double value;
public:
// Конструктор
MemberReal(double val = 0.0) : value(val) {}
double getValue() const { return value; }
// --- Унарный оператор ++ (функция-член) ---
// Префиксный инкремент (++obj)
MemberReal& operator++() {
++value;
return *this;
}
// Постфиксный инкремент (obj++)
MemberReal operator++(int) {
MemberReal temp = *this;
value++;
return temp;
}
// --- Бинарный оператор + (функция-член) ---
// Складывает текущий объект с другим объектом
MemberReal operator+(const MemberReal& other) const {
return MemberReal(this->value + other.value);
}
};
// =========================================================================
// ВАРИАНТ 2: Операторы реализованы как дружественные функции
// =========================================================================
class FriendReal {
private:
double value;
public:
// Конструктор
FriendReal(double val = 0.0) : value(val) {}
double getValue() const { return value; }
// Объявление дружественных функций
friend FriendReal& operator++(FriendReal& r); // Префиксный инкремент
friend FriendReal operator+(const FriendReal& a, const FriendReal& b); // Бинарное сложение
};
// Реализация дружественного префиксного инкремента
FriendReal& operator++(FriendReal& r) {
++r.value;
return r;
}
// Реализация дружественного бинарного сложения
FriendReal operator+(const FriendReal& a, const FriendReal& b) {
return FriendReal(a.value + b.value);
}
// =========================================================================
// Демонстрация работы программы
// =========================================================================
int main() {
std::setlocale(LC_ALL, "Russian");
std::cout << "=== 1. ДЕМОНСТРАЦИЯ ФУНКЦИЙ-ЧЛЕНОВ КЛАССА ==-\n";
MemberReal a(5.5);
std::cout << "Начальное значение a: " << a.getValue() << "\n";
++a; // Префиксный инкремент
std::cout << "После префиксного ++a: " << a.getValue() << "\n";
a++; // Постфиксный инкремент
std::cout << "После постфиксного a++: " << a.getValue() << "\n";
MemberReal b(2.0);
MemberReal c = a + b; // Бинарный оператор +
std::cout << "Результат сложения a (" << a.getValue() << ") + b (" << b.getValue() << ") = " << c.getValue() << "\n\n";
std::cout << "=== 2. ДЕМОНСТРАЦИЯ ДРУЖЕСТВЕННЫХ ФУНКЦИЙ ==-\n";
FriendReal x(10.1);
std::cout << "Начальное значение x: " << x.getValue() << "\n";
++x; // Префиксный инкремент (через дружественную функцию)
std::cout << "После префиксного ++x: " << x.getValue() << "\n";
FriendReal y(4.4);
FriendReal z = x + y; // Бинарный оператор + (через дружественную функцию)
std::cout << "Результат сложения x (" << x.getValue() << ") + y (" << y.getValue() << ") = " << z.getValue() << "\n";
return 0;
}