friend std::istream& operator>>(std::istream& is, Time& time);
Объявление двух дружественных классу Time перегруженных операторов (ввода и вывода). Совершенно бесполезные строки, учитывая, что в коде, который перегружает эти операторы не используются закрытые члены класса Time, а используются m_minutes и m_hours, объявленные в классе Time как public.
Использование этих двух строк было бы уместно, если бы m_minutes и m_hours были бы private.
Восстановим порядок выполнения команд:
1 команда (умножь на 2): 18 * 2 = 36
2 команда (прибавь b): 36 + b = ...
3 команда (умножь на 2): ...
4 команда (прибавь b): ... = 99
5 команда (умножь на 2): 99 * 2 = 198
Теперь распишем более подробно, заменив неизвестные буквами x и y:
1 команда (умножь на 2): 18 * 2 = 36
2 команда (прибавь b): 36 + b = x
3 команда (умножь на 2): x * 2 = y
4 команда (прибавь b): y + b = 99
5 команда (умножь на 2): 99 * 2 = 198
Теперь выписываем равенства с буквами:
36 + b = x
x * 2 = y
y + b = 99
Из этого мы можем составить уравнение, т.е. делаем методом подстановки:
36 + b = x
x * 2 = y (x нам известен из верхнего уравнения x = b + 36, переносим его в следующее)
(36 + b) * 2 = y (жирным выделен наш x)
Идем дальше:
y + b = 99 (y нам известен из верхнего уравнения y = (36 + b) * 2, переносим его в следующее)
(36 + b) * 2 + b = 99 (жирным выделен наш y)
А теперь решаем полученное уравнение:
(36 + b) * 2 + b = 99
2 * 36 + 2 * b + b = 99
72 + 2b + b = 99
72 + 3b = 99
3b = 99 - 72
3b = 27
b = 27 / 3
b = 9
Мы нашли b. Теперь делаем проверку:
1 команда (умножь на 2): 18 * 2 = 36
2 команда (прибавь b): 36 + 9 = 45
3 команда (умножь на 2): 45 * 2 = 90
4 команда (прибавь b): 90 + 9 = 99
5 команда (умножь на 2): 99 * 2 = 198
Все верно!
ответ: 9
Данный код представляет собой описание класса Time, содержащего два конструктора, два поля, и перегруженные операторы ввода, вывода и вычитания.
Вот эта конструкция:
Time()
: m_hours(0), m_minutes(0) {
}
Это конструктор класса без параметров, инициализирует переменные
m_hours и m_minutes, присваивая им ноль.
Time(short hours, short minutes)
: m_hours(hours), m_minutes(minutes) {
}
Конструктор класса с параметрами
Time operator-(const Time& time) {
Определение оператора вычитания для класса . Необходимо для того, чтобы можно было вычитать одно время из другого. Например, так:
Time t(5, 30), t2(1, 20); // Использование конструктора с параметрами
t=t - t2; // Использование оператора вычитания
std::cout << t; // Выведет 4:10
// Чтобы была возможность использовать такое выражение, мы переопределяем оператор вывода, о чем чуть ниже.
friend std::ostream& operator<<(std::ostream& os, const Time& time);
friend std::istream& operator>>(std::istream& is, Time& time);
Объявление двух дружественных классу Time перегруженных операторов (ввода и вывода). Совершенно бесполезные строки, учитывая, что в коде, который перегружает эти операторы не используются закрытые члены класса Time, а используются m_minutes и m_hours, объявленные в классе Time как public.
Использование этих двух строк было бы уместно, если бы m_minutes и m_hours были бы private.
std::ostream& operator<<(std::ostream& os, const Time& time) {
Перегрузка оператора вывода , чтобы мы могли делать так:
std::cout << t;
std::istream& operator>>(std::istream& is, Time& time) {
Перегрузка оператора ввода , чтобы мы могли делать так:
std::cin >> t;
Дополнительные объяснения, если непонятно что-то конкретное, спрашивайте в комментариях.