Арифметические операторы и операторы сравнения
Перегружайте +, -, *, /, ==, < и дружественные операторы согласно лучшим практикам.
«Арифметические операторы и операторы сравнения» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Арифметические операторы и операторы сравнения
- Операторы вставки и извлечения потоков
- Операторы индексирования и вызова функции
- Оператор трёхстороннего сравнения C++20