Большинство операторов C++ можно перегружать, чтобы задать специальное поведение для пользовательских типов. Но есть важные ограничения, которые нужно понимать.
Следующие операторы нельзя перегружать:
. (оператор доступа к члену)?: (тернарный условный оператор)sizeof (оператор размера):: (оператор разрешения области видимости).* (оператор указателя на член)Почти все остальные операторы можно перегружать, включая:
+, -, *, /, %==, !=, <, >, <=, >==, +=, -= и т.д.[]()<<, >>Оператор индексирования [] — один из наиболее часто перегружаемых операторов; он позволяет работать с пользовательскими классами так же, как с массивами.
Без перегрузки оператора:
class Array {
int& elem(unsigned i) {
if (i > 99) error();
return data[i];
}
private:
int data[100];
};
Array a;
a.elem(10) = 42;
С перегрузкой оператора:
class Array {
int& operator[](unsigned i) {
if (i > 99) error();
return data[i];
}
private:
int data[100];
};
Array a;
a[10] = 42; // Гораздо более чистый синтаксис
Перегрузка операторов даёт более чистый и интуитивный синтаксис для пользовательских типов. При этом важно соблюдать ограничения на неперегружаемые операторы — это сохраняет целостность языка C++ и предсказуемость кода.
Оператор :: (разрешение области видимости) нельзя перегружать, потому что его перегрузка нарушила бы фундаментальный механизм языка для доступа к пространствам имён и членам класса.
Новый — ещё не проверен сообществом
Вы