14.5. Оператор индексирования

Классы, представляющие контейнеры, способные возвращать элементы по позиции, зачастую определяют оператор индексирования operator[].

Оператор индексирования должен быть определен как функция-член класса.

Согласно общепринятому смыслу индексирования, оператор индексирования обычно возвращает ссылку на выбранный элемент. Возвращающий ссылку оператор индексирования применим с обеих сторон оператора присвоения. Следовательно, имеет смысл определить и константную, и неконстантную версии этого оператора. При применении к константному объекту оператор индексирования должен возвращать ссылку на константу, чтобы предотвратить присвоение возвращенному объекту.

Если у класса есть оператор индексирования, он обычно должен быть определен в двух версиях: возвращающей простую ссылку и являющуюся константной функцией-членом, а следовательно, возвращающую ссылку на константу.

В качестве примера определим оператор индексирования для класса StrVec (см. раздел 13.5):

class StrVec {

public:

 std::string& operator[](std::size_t n)

  { return elements[n]; }

 const std::string& operator[](std::size_t n) const

  { return elements[n]; }

 // другие члены, как в разделе 13.5

private:

 std::string *elements; // указатель на первый элемент массива

};

Эти операторы можно использовать таким же образом, как и индексирование вектора или массива. Поскольку оператор индексирования возвращает ссылку на элемент, если объект класса StrVec не константен, то этому элементу можно присвоить значение; если индексируется константный объект, присвоение невозможно:

// svec - объект класса StrVec

const StrVec cvec = svec; // копировать элементы из svec в cvec

// если у svec есть элементы, выполнить функцию empty() класса string

// для первого

if (svec.size() && svec[0].empty()) {

 svec[0] = "zero"; // ok: индексирование возвращает ссылку на строку

 cvec[0] = "Zip";  // ошибка: индексация cvec возвращает ссылку на

                   // константу

}

Упражнения раздела 14.5

Упражнение 14.26. Определите операторы индексирования для классов StrVec, String, StrBlob и StrBlobPtr.

Более 800 000 книг и аудиокниг! 📚

Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением

ПОЛУЧИТЬ ПОДАРОК