Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Согласно общепринятому смыслу индексирования, оператор индексирования обычно возвращает ссылку на выбранный элемент. Возвращающий ссылку оператор индексирования применим с обеих сторон оператора присвоения. Следовательно, имеет смысл определить и константную, и неконстантную версии этого оператора. При применении к константному объекту оператор индексирования должен возвращать ссылку на константу, чтобы предотвратить присвоение возвращенному объекту.
Если у класса есть оператор индексирования, он обычно должен быть определен в двух версиях: возвращающей простую ссылку и являющуюся константной функцией-членом, а следовательно, возвращающую ссылку на константу.
В качестве примера определим оператор индексирования для класса 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.26. Определите операторы индексирования для классов StrVec, String, StrBlobи StrBlobPtr.
14.6. Операторы инкремента и декремента
Операторы инкремента ( ++) и декремента ( --) обычно реализуют для классов итераторов. Эти операторы позволяют перемещать итератор с элемента на элемент последовательности. Язык никак не требует, чтобы эти операторы были членами класса. Но поскольку они изменяют состояние объекта, с которым работают, лучше сделать их членами класса.
Для встроенных типов есть префиксные и постфиксные версии операторов инкремента и декремента. Ничего удивительного, что для собственных классов также можно определить префиксные и постфиксные версии этих операторов. Давайте сначала рассмотрим префиксные версии, а затем реализуем постфиксные.
Классы, определяющие операторы инкремента или декремента, должны определять как префиксные, так и постфиксные их версии. Обычно эти операторы определяют как функции-члены.
Для иллюстрации операторов инкремента и декремента определим их для класса StrBlobPtr(см. раздел 12.1.6):
class StrBlobPtr {
public:
// инкремент и декремент
StrBlobPtr& operator++(); // префиксные операторы
StrBlobPtr& operator--();
// другие члены как прежде
};
Чтобы соответствовать встроенным типам, префиксные операторы должны возвращать ссылку на объект после инкремента или декремента.
Операторы инкремента и декремента работают подобным образом — они вызывают функцию check()для проверки допустимости объекта класса StrBlobPtr. Если это так, то функция check()проверяет также допустимость данного индекса. Если функция check()не передает исключения, эти операторы возвращают ссылку на свой объект.
В случае инкремента функции check()передается текущее значение curr. Пока это значение меньше размера основного вектора, функция check()завершается нормально. Если значение currнаходится за концом вектора, функция check()передает исключение:
// префикс: возвращает ссылку на объект после инкремента
// или декремента
StrBlobPtr& StrBlobPtr::operator++() {
// если curr уже указывает после конца контейнера, инкремент
// невозможен
check(curr, "increment past end of StrBlobPtr");
++curr; // переместить текущую позицию вперед
return *this;
}
StrBlobPtr& StrBlobPtr::operator--() {
// если curr равен нулю, то декремент возвратит недопустимый индекс
--curr; // переместить текущую позицию назад
check(-1, "decrement past begin of StrBlobPtr");
return *this;
}
Оператор декремента уменьшает значение currпрежде, чем вызвать функцию check(). Таким образом, если значение curr(беззнаковое) уже является нулем, передаваемое функции check()значение будет наибольшим позитивным значением, представляющим недопустимый индекс (см. раздел 2.1.2).
При определении префиксных и постфиксных операторов возникает одна проблема: каждый из них имеет одинаковое имя и получает одинаковое количество параметров того же типа. При обычной перегрузке невозможно отличить префиксную и постфиксную версии оператора.
Для решения этой проблемы постфиксные версии получают дополнительный (неиспользуемый) параметр типа int. При использовании постфиксного оператора компилятор присваивает этому параметру аргумент 0. Хотя постфиксная функция вполне может использовать этот дополнительный параметр, как правило, так не поступают. Этот параметр не нужен для работы, обычно выполняемой постфиксным оператором. Его основная задача заключается в том, чтобы отличить определение постфиксной версии функции от префиксной.
Теперь в класс CheckedPtrможно добавить постфиксные операторы:
class StrBlobPtr {
public:
// инкремент и декремент
StrBlobPtr operator++(int); // постфиксные операторы
StrBlobPtr operator--(int);
// другие члены как прежде
};
Для совместимости со встроенными операторами постфиксные операторы должны возвращать прежнее значение (существовавшее до декремента или инкремента). Оно должно быть возвращено как значение, а не как ссылка.
Интервал:
Закладка: