Операторы индексирования и вызова функции
Перегружайте [] и (), чтобы типы вели себя как контейнеры или вызываемые объекты.
«Операторы индексирования и вызова функции» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
operator[] — доступ по индексу
Перегрузите [], чтобы с Вашим типом можно было работать как с массивом. Это полезно для контейнеров, матриц и классов изображений.
class Vec {
std::vector<double> data_;
public:
double& operator[](size_t i) { return data_[i]; }
double operator[](size_t i) const { return data_[i]; }
};Две перегрузки: const и неконстантная
Предоставьте обе перегрузки. Вызов для константного экземпляра направляется к перегрузке с const, а неконстантная перегрузка позволяет выполнять присваивание.
Проверка границ
Обычный operator[] по соглашению не проверяет границы. Предоставьте отдельный метод at(), который генерирует исключение, как в стандартной библиотеке.
double& at(size_t i) {
if (i >= data_.size()) throw std::out_of_range("");
return data_[i];
}Многомерный индекс (C++23)
В C++23 появился индекс с аргументами, разделёнными запятыми: m[i, j]. В более ранних версиях требуются вызов функции или цепочка индексов.
// C++23
double& operator[](size_t i, size_t j);
// Pre-C++23 workaround
double& operator()(size_t i, size_t j);operator() — вызов функции
Перегрузите (), чтобы экземпляры можно было вызывать как функции. Это используется для функторов, индексации матриц и настраиваемых предикатов.
struct Square {
int operator()(int x) const { return x * x; }
};
Square sq;
std::cout << sq(5); // 25Функторы с состоянием
Оператор вызова функции может работать с переменными-членами, превращая объект в вызываемый объект с состоянием.
struct GreaterThan {
int threshold;
bool operator()(int x) const { return x > threshold; }
};
GreaterThan over10{10};
std::cout << over10(15); // trueИспользование с алгоритмами STL
Передавайте экземпляры функторов алгоритмам вместо функций.
std::vector<int> v = {1, 11, 2, 22};
auto it = std::find_if(v.begin(), v.end(), GreaterThan{10});Операторы с несколькими аргументами
И [] (до C++23), и () можно перегружать с любым количеством аргументов. До C++23 для доступа, подобного матричному, более гибким выбором является ().
Возврат ссылок и значений
Возвращайте ссылку, чтобы разрешить присваивание через индекс. Для типов, доступных только для чтения, возвращайте значение.
Прокси-объекты
Если operator[] должен возвращать сложный объект, например битовое поле, возвращайте небольшой прокси-класс с операторами преобразования и присваивания.
Примеры из практики
Распространённые варианты использования:
std::vector::operator[]std::map::operator[]— вставляет отсутствующие ключи- Классы матриц:
m(i, j) - Функторы для алгоритмов
Быстрая проверка
Как сделать экземпляры класса вызываемыми подобно функции?
Итоги
Перегружайте [] для доступа по индексу, предоставляя константную и неконстантную перегрузки. Перегружайте (), чтобы сделать экземпляры вызываемыми, — это основа функторов и лямбд.
Часто задаваемые вопросы
Урок «Операторы индексирования и вызова функции» бесплатный?
Да — полный текст урока «Операторы индексирования и вызова функции» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Операторы индексирования и вызова функции»?
Перегружайте [] и (), чтобы типы вели себя как контейнеры или вызываемые объекты. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Операторы индексирования и вызова функции»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Арифметические операторы и операторы сравнения
- Операторы вставки и извлечения потоков
- Операторы индексирования и вызова функции
- Оператор трёхстороннего сравнения C++20