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.