Перегрузка функций — это возможность создать несколько функций с одним именем, но разными аргументами. Это используется для повышения читаемости и обеспечения интуитивного интерфейса.
Перегрузка операторов — возможность определять, как стандартные операторы работают с пользовательскими типами данных (классами или структурами).
Ограничения перегрузки операторов:
.:, .*, ::, sizeof, ?: и др.).Пример перегрузки оператора "+":
class Vector2D { public: float x, y; Vector2D(float _x, float _y): x(_x), y(_y) {} Vector2D operator+(const Vector2D& rhs) const { return Vector2D(x + rhs.x, y + rhs.y); } };
Разрешено ли в C++ перегружать оператор запятая (
,) и если да, для чего это может использоваться?
Ответ:
Да, оператор запятая можно перегружать для пользовательских классов.
Однако перегружать оператор запятая следует только при наличии веского смысла, поскольку это может запутать читающего код и привести к неожиданным последствиям.
struct Logger { Logger& operator,(const std::string& msg) { std::cout << msg; return *this; } };
История
В рамках математической библиотеки был перегружен оператор==для сравнения объектов, но забыли перегрузить оператор<. Это привело к ошибкам компиляции при попытке использовать контейнеры STL, требующие оператора сравнения, напр.std::set,std::map.
История
Разработчик перегрузил оператор+для классаMatrix, но вместо возвращения нового объекта всегда изменял левый операнд. Итогом стали неожиданные side-эффекты и нарушение принципа "чистоты" операций.
История
При перегрузке функции с разными типами аргументов не был предусмотрен const-квалификатор:void foo(SomeClass&); void foo(const SomeClass&);Это привело к неоднозначности вызова функции и ошибкам компиляции при передаче временных объектов.