Основное из главы 11. Прата.
Перегрузка операций с помощью operate,  основная суть в том, что можем использовать стандартные операторы (+, -, *, << и так далее) с пользовательскими объектами класса.
Перегрузка операций.

class Distance {
private:
    int meters;
    int centimeters;
public:
    Distance(int m = 0, int cm = 0) : meters(m), centimeters(cm) {}
    //(1)
    Distance operator+(const Distance & other) const {
        Distance result;
        result.centimeters = centimeters + other.centimeters;
        result.meters = meters + other.meters + result.centimeters / 100;
        result.centimeters %= 100;
        return result;
    }
    //(2)
    Distance operator-(const Distance & other) const {
        int total1 = meters * 100 + centimeters;
        int total2 = other.meters * 100 + other.centimeters;
        int diff = total1 - total2;
        return Distance(diff / 100, diff % 100);
    }
    //(3)
    Distance operator*(double factor) const {
        double total = (meters * 100 + centimeters) * factor;
        int totalCm = int(total + 0.5);
        return Distance(totalCm / 100, totalCm % 100);
    }
   
    void show() const {
        std::cout << meters << " m " << centimeters << " cm";
    }
};

(1) Принцип работы operator. Можно поделить выражение (такое
как a = a + b или c = a + b) на две части: левую и правую. Как раз-таки мы работаем с левой частью, то есть “a”, чтобы было попроще можно это объяснить по другому: мы перегружаем “+”значит левая часть будет слева от “+”, потому что может быть и такое выражение – d = a+ b + c (или для упрощения d = ((a + b)+c) ), что значит первая левая часть будет “a”( a.operator+(b)), а после – “a+b” ((a + b).operator+(c)). Здесь есть один из важных моментов. Как мы можем наблюдать, то operator+ возвращаем константный объект типа Distance. Может показаться, что можно было бы сделать код проще и эффективнее, то есть не создавать локальный объект Distance result, а сразу же изменять левую часть. То есть записать следующим образом:
(4)

Distance Distance::operator+(const Distance& other) {
    centimeters = centimeters + other.centimeters;
    meters += other.meters + centimeters / 100;
    centimeters %= 100;
    return *this;
}

Для понимания, что делается в коде (4). Складываем сантиметры centimeters, после вычисляем метры (складываем метры с метрами) и делим сантиметры на 100, чтобы получить метры с сантиметров. Далее, чтобы убираем «лишние сантиметры» с помощью деления на модуль (допустим у нас скопилось 132 снатиметра, 132 % 100 = 32 осталось, 100 сантиметров ушло).

А теперь, тот важный момент (4). Мы сразу изменяем левый операнд и его возвращаем, тогда получается следующая ситуация, допустим, у нас есть выражение a =  b + c, тогда операнд b изменятся, посмотрим:
Просмотры: 39
Открыть в MAX Сообщить о неточности

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти