C++ Academy · Урок

Арифметические операторы и операторы сравнения

Перегружайте +, -, *, /, ==, < и дружественные операторы согласно лучшим практикам.

Урок 1 из 413 шагов

«Арифметические операторы и операторы сравнения» — бесплатный урок C++ Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Зачем перегружать операторы

Перегрузка операторов позволяет Вашим типам вести себя как встроенные типы: v1 + v2 читается лучше, чем v1.add(v2). Используйте её для типов-значений, например векторов, комплексных чисел и денежных величин.

Определение operator+

Вы можете перегрузить + как член класса или как свободную функцию. Свободные функции более симметричны.

struct Vec2 {
    double x, y;
    Vec2 operator+(const Vec2& other) const {
        return {x + other.x, y + other.y};
    }
};

Форма свободной функции

Свободная функция даёт обоим операндам одинаковый статус — это полезно, когда преобразование может применяться к любой стороне.

Vec2 operator+(const Vec2& a, const Vec2& b) {
    return {a.x + b.x, a.y + b.y};
}

Составные операторы присваивания

Сначала реализуйте +=, а затем создайте на его основе +. Это канонический идиоматический приём.

Vec2& operator+=(const Vec2& other) {
    x += other.x;
    y += other.y;
    return *this;
}

Vec2 operator+(Vec2 lhs, const Vec2& rhs) {
    lhs += rhs;
    return lhs;
}

Унарные операторы

Некоторые операторы являются унарными: -x, +x, !x, ~x, ++x, --x.

Vec2 operator-() const { return {-x, -y}; }

Префиксный и постфиксный инкремент

Префиксная форма не принимает параметров, а постфиксная принимает фиктивный int, чтобы различать эти формы.

Counter& operator++();        // prefix
Counter  operator++(int);     // postfix

Операторы сравнения

Операторы сравнения возвращают bool. Для единообразия лучше всего подходят свободные функции.

bool operator==(const Vec2& a, const Vec2& b) {
    return a.x == b.x && a.y == b.y;
}
bool operator!=(const Vec2& a, const Vec2& b) { return !(a == b); }

Меньше для упорядочивания

Если Ваш тип нужно сортировать или использовать как ключ в словаре, определите operator<. Остальные операторы отношений следуют из него.

Симметричные операторы смешанных типов

Чтобы поддержать и 3 + vec, и vec + 3, определите обе формы или используйте свободную функцию с преобразованием.

Избегайте неожиданного поведения

Перегруженные операторы должны вести себя интуитивно. Не переопределяйте смысл + как вычитание. Следуйте общепринятым алгебраическим свойствам оператора.

Операторы, которые нельзя перегружать

Некоторые операторы недоступны для перегрузки:

  • ?: — тернарный оператор
  • . — доступ к члену (но -> перегружать можно)
  • :: — разрешение области видимости
  • sizeof, alignof, typeid

Быстрая проверка

Каков канонический шаблон реализации operator+ для пользовательского типа?

Итоги

Перегрузка операторов позволяет работать с пользовательскими типами так же естественно, как со встроенными. Сначала реализуйте составное присваивание, а затем обычные арифметические операторы. Операторы сравнения лучше реализовывать как свободные функции. Придерживайтесь общепринятой семантики — неожиданное поведение является ошибкой.

Можно начать бесплатно

Изучай C++ с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «Арифметические операторы и операторы сравнения» бесплатный?

Да — полный текст урока «Арифметические операторы и операторы сравнения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Арифметические операторы и операторы сравнения»?

Перегружайте +, -, *, /, ==, < и дружественные операторы согласно лучшим практикам. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Арифметические операторы и операторы сравнения»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Арифметические операторы и операторы сравнения
  2. Операторы вставки и извлечения потоков
  3. Операторы индексирования и вызова функции
  4. Оператор трёхстороннего сравнения C++20
← Назад к C++ Academy