Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Лекция 5-6_n — копия.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
144.59 Кб
Скачать

Void operator [] (std::string index);

};

// Нет смысла перегружать операцию [] только для вывода чего-либо,

// но это самый простой способ показать, что параметр функции может быть не только целочисленным значением

Void Something::operator [] (std::string index){

std::cout << index;

}

Int main () {

Something something;

Something ["Hello, world!"];

return 0;

}

Результат выполнения программы:

Hello, world!

Перегрузка операции индексации обычно используется для обеспечения прямого доступа к элементам массива, который находится внутри класса (в качестве переменной-члена). Поскольку строки часто используются в реализации массивов символов, то оператор [] часто перегружают в классах со строками, чтобы иметь доступ к каждому символу строки отдельно.

Перегрузка операции ()

Все операции, перегрузку которых мы рассматривали до сих пор, позволяли нам самостоятельно определять тип параметров в функции перегрузки операции, но не их количество.

Например, операция == всегда принимает два параметра, тогда как операция (!) всегда принимает один параметр.

Операция () является особенно интересной, поскольку позволяет изменять как тип параметров, так и их количество.

Но следует помнить о двух вещах:

Во-первых, перегрузка круглых скобок должна осуществляться через метод класса!

Во-вторых, в не объектно-ориентированном C++ оператор () является оператором вызова функции.

В случае с классами перегрузка круглых скобок выполняется в методе operator() () {} (в объявлении функции перегрузки находятся две пары круглых скобок).

Рассмотрим следующий класс:

class Matrix {

private:

double data [5][5];

public:

Matrix () {

// Присваиваем всем элементам массива значение 0.0

for (int row=0; row < 5; ++row)

for (int col=0; col < 5; ++col)

data[row][col] = 0.0;

}

};

Матрицы являются ключевой концепцией в линейной алгебре и часто используются в геометрическом моделировании и в 3D-графике.

Всё, что вам нужно знать сейчас — это то, что класс Matrix является двумерным массивом (5×5 типа double).

На уроке о перегрузке операции индексации мы использовали операцию [] для прямого доступа к элементам закрытого одномерного массива.

Здесь же нам нужен доступ к элементам двумерного массива.

Поскольку операция [] ограничена лишь одним параметром, то её функциональности недостаточно для доступа к двумерному массиву.

Однако, поскольку оператор () может принимать разное количество параметров, мы можем объявить версию operator(), которая будет принимать два целочисленных параметра (два индекса), и использовать эти индексы для доступа к элементам нашего двумерного массива. Например:

#include <iostream>

#include <cassert> // для assert ()

class Matrix {

private:

double data [5][5];

public:

Matrix () {

// Присваиваем всем элементам массива значение 0.0

for (int row=0; row < 5; ++row)

for (int col=0; col < 5; ++col)

data[row][col] = 0.0;

}

double& operator () (int row, int col);

const double& operator () (int row, int col) const; // для константных //объектов

};

double& Matrix:operator () (int row, int col) {

assert (col >= 0 && col < 5);

assert (row >= 0 && row < 5);

return data[row][col];

}

const double& Matrix::operator()(int row, int col) const {

assert(col >= 0 && col < 5);

assert(row >= 0 && row < 5);

return data[row][col];

}