Я просто спросить про указатели C++ (изучаю С++).
Основное из главы 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 изменятся, посмотрим: