Определение и перегрузка операторов класса в C++

41 комментерий

В C++ можно определять пользовательские операторы для собственных типов данных. Оператор определяется, как обычная функция-член класса, только после определения возвращаемого типа ставится ключевое слово operator.

Пример определения оператора сложения:

int operator+ (int value) { return number + value; }

Оператор может быть унарным или бинарным. Унарный оператор не принимает никаких аргументов. Например, оператор отрицания — «!». Бинарный оператор принимает дополнительный параметр. Например, в случае со сложением, принимается второе слагаемое.

Чтобы прояснить картину, попробуем написать класс simple_fraction, который будет описывать простую дробь с целыми числителем и знаменателем. И определим операторы сложения, вычитания, умножения и деления для этого класса.

/*
 * Класс, описывающий простую дробь
*/
class simple_fraction
{
public:
    simple_fraction(int numerator, int denominator)
    {
        if (denominator == 0) // Ошибка деления на ноль
            throw std::runtime_error("zero division error");
        this->numerator = numerator;
        this->denominator = denominator;
    }

    // Определение основных математических операций для простой дроби
    double operator+ (int val) { return number() + val; } // Сложение
    double operator- (int val) { return number() - val; } // Вычитание
    double operator* (int val) { return number() * val; } // Умножение
    double operator/ (int val) // Деление
    {
        if (val == 0) {
            throw std::runtime_error("zero division error");
        }
        return number() / val;
    }

    // Получение значения дроби в виде обычного double-числа
    double number() { return numerator / (double) denominator; }
private:
    int numerator; // Числитель
    int denominator; // Знаменатель
};

Для операции деления, мы также сделали проверку деления на ноль.

Пример использования класса simple_fraction:

// Простая дробь 2/3
simple_fraction fr(2, 3);

double sum = fr + 10; // сумма
double diff = fr - 10; // разность
double factor = fr * 10; // произведение
double div = fr / 10; // частное

Операторы можно перегружать так же, как и обычные функции-члены класса. Например, можно перегрузить оператор сложения для двух простых дробей, который будет возвращать новую простую дробь. Тогда, нам придется привести дроби к общему знаменателю и вернуть другую простую дробь.

Задание: усовершенствуйте класс simple_fraction. Перегрузите операторы сложения, вычитания, умножения и деления так, чтобы можно было производить операции над двумя простыми дробями и получать новую простую дробь. Реализуйте приведение двух дробей к общему знаменателю.

Пример использования будущего класса:

simple_fraction fr1(2, 3);
simple_fraction fr2(3, 4);

// 2/3 + 3/4 — это 17/12
simple_fraction sum = fr1 + fr2;

Комментарии к статье: 41

Подождите, загружаются комментарии...

Возможность комментировать эту статью отключена автором. Возможно, во всем виновата её провокационная тематика или большое обилие флейма от предыдущих комментаторов.

Если у вас есть вопросы по содержанию статьи, рекомендуем вам обратиться за помощью на наш форум.