Программирование. Принципы и практика использования C++ Исправленное издание, стр. 244
Если ваши проблемы слишком велики, чтобы решить их с помощью таких простых средств, освойте профессиональные средства отладки; они называются детекторами утечек (leak detectors). В идеале, разумеется, следует не устранять утечки, а программировать так, чтобы они вообще не возникали.
18.4. Доступ к элементам вектора
До сих пор (см. раздел 17.6) для доступа к элементам вектора мы использовали функции-члены
set()get()v[i]operator[]class vector { int sz; // размер double* elem; // указатель на элементыpublic: // ... double operator[](int n) { return elem[n]; } // возвращаем // элемент};Все выглядит хорошо и просто, но, к сожалению, слишком просто. Разрешив оператору индексирования (
operator[]()vector v(10);int x = v[2]; // хорошоv[3] = x; // ошибка: v[3] не может стоять в левой // части оператора =Здесь выражение
v[i]v.operator[](i)vivectorv[3]ПОПРОБУЙТЕ
Создайте вариант класса
vectorv[3]=x;В следующей версии мы разрешим оператору
operator[]class vector { int sz; // размер double* elem; // указатель на элементpublic: // ... double* operator[](int n) { return &elem[n]; } // возвращаем // указатель};При таком определении мы можем записывать элементы.
vector v(10);for (int i=0; i<v.size(); ++i) { // работает, но по-прежнему // некрасиво *v[i] = i;cout << *v[i];}Здесь выражение
v[i]v.operator[](i)vi*set()get()class vector { // ... double& operator[ ](int n) { return elem[n]; } // возвращаем // ссылку};Теперь можем написать следующий вариант.
vector v(10);for (int i=0; i<v.size(); ++i) { // работает! v[i] = i; // v[i] возвращает ссылку на элемент с номером i cout << v[i];}Мы обеспечили традиционные обозначения: выражение
v[i]v.operator[](i)vi18.4.1. Перегрузка ключевого слова const
Функция
operator[]()void f(const vector& cv){ double d = cv[1]; // неожиданная ошибка cv[1] = 2.0; // ожидаемая ошибка}Причина заключается в том, что наша функция
vector::operator[]()vectorconstclass vector { // ... double& operator[](int n); // для неконстантных векторов double operator[](int n) const; // для константных векторов};