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 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОК