Перегрузка операторов

Последнее обновление: 13.03.2023
Упражнение 1

Дан класс:

#include <iostream>

class Integer
{
public:
    Integer(double n)
    {
        value = n;
    }

    void print()  const
    {
        std::cout << "value: " << value << std::endl;
    }
private:
    double value;
};

Определите для класса Integer оператор, который позволяет умножать объект Integer на число. Причем определите версии для умножения как на целое, так и на дробное число.

Решение
#include <iostream>

class Integer
{
public:
    Integer(double n)
    {
        value = n;
    }
    void print()  const
    {
        std::cout << "value: " << value << std::endl;
    }
    // объявление оператора
    Integer operator*(double n) const;
private:
    double value;
};
// реализация оператора
Integer Integer::operator*(double n) const
{
    return Integer{ value * n };
}

int main()
{
    Integer i1{22};
    Integer i2 {i1 * 5};
    Integer i3 {i1 * 5.5};
    i2.print();     // value: 110
    i3.print();     // value: 121
}
Упражнение 2

Создайте класс Rational, который представляет дробь. Определите в нем переменные, которые представляют числитель и знаменатель. Также определите для этого класса операторы сложения и умножения, а также оператор вывода на консоль.

Решение
#include <iostream> 

class Rational
{
public:
    Rational(int num, int denom) 
    {
        numerator = num;
        // если знаменатель равен 0 
        if(denom==0) denom = 1;
        denominator = denom;
    }         

    Rational operator+(const Rational& other) const
    {
        int denom {denominator};
        int num { numerator + other.numerator};
        // если знаменатели разные
        if(denominator != other.denominator)
        {
            num = numerator * other.denominator + other.numerator * denominator;
            denom = denominator * other.denominator;
        }
        return Rational{num, denom};
    };
    Rational operator*(const Rational& other) const
    { 
        int denom {denominator * other.denominator};
        int num { numerator * other.numerator};
        return Rational{num, denom};
    };
    int getNumerator() const { return numerator; }
    int getDenominator() const { return denominator; }
private:
  int numerator, denominator;
};

// оператор вывода на консоль
inline std::ostream& operator<<(std::ostream& stream, const Rational& r)
{
	return stream << r.getNumerator() << "/" << r.getDenominator();
}

int main()
{
    Rational r1{3, 4};      // 3/4
    Rational r2{1, 2};      // 1/2
    Rational r3{r1 + r2};   
    std::cout << r3 << std::endl;   // 10/8

    Rational r4{r1 * r2};
    std::cout << r4 << std::endl;   // 3/8

    Rational r5{1, 4};      // 1/4
    Rational r6{r1 + r5};  // 3/4 + 1/4 
    std::cout << r6 << std::endl;   // 4/4

    Rational r7{4,0};   // 4/1
    std::cout << r7 << std::endl;   // 4/1
}
Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850