Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
unique_ptr p1(new string("Stegosaurus"));
unique_ptr p2(p1); // ошибка: невозможно копирование unique_ptr
unique_ptr p3;
p3 = p2; // ошибка: невозможно присвоение unique_ptr
Хотя указатель unique_ptrнельзя ни присвоить, ни скопировать, можно передать собственность от одного (неконстантного) указателя unique_ptrдругому, вызвав функцию release()или reset():
// передает собственность от p1 (указывающего на
// строку "Stegosaurus") к p2
unique_ptr p2(p1.release()); // release() обнуляет p1
unique_ptr p3(new string("Trex"));
// передает собственность от p3 к p2
р2.reset(p3.release()); // reset() освобождает память, на которую
// указывал указатель p2
Функция-член release()возвращает указатель, хранимый в настоящее время в указателе unique_ptr, и обнуляет указатель unique_ptr. Таким образом, указатель p2инициализируется указателем, хранимым в указателе p1, а сам указатель p1становится нулевым.
Функция-член reset()получает необязательный указатель и переустанавливает указатель unique_ptrна заданный указатель. Если указатель unique_ptrне нулевой, то объект, на который он указывает, удаляется. Поэтому вызов функции reset()указателя p2освобождает память, используемую строкой со значением "Stegosaurus", передает содержимое указателя p3указателю p2и обнуляет указатель p3.
Вызов функции release()нарушает связь между указателем unique_ptrи объектом, который он контролирует. Зачастую указатель, возвращенный функцией release(), используется для инициализации или присвоения другому интеллектуальному указателю. В этом случае ответственность за управление памятью просто передается от одного интеллектуального указателя другому. Но если другой интеллектуальный указатель не используется для хранения указателя, возвращенного функцией release(), то ответственность за освобождения этого ресурса берет на себя программа:
p2.release(); // ОШИБКА: p2 не освободит память, и указатель
// будет потерян
auto p = p2.release(); // ok, но следует не забыть delete(p)
unique_ptrИз правила, запрещающего копирование указателя unique_ptr, есть одно исключение: можно копировать и присваивать те указатели unique_ptr, которые предстоит удалить. Наиболее распространенный пример — возвращение указателя unique_ptrиз функции:
unique_ptr clone(int p) {
// ok: явное создание unique_ptr для int*
return unique_ptr(new int(p));
}
В качестве альтернативы можно также возвратить копию локального объекта:
unique_ptr clone(int p) {
unique_ptr ret(new int(p));
// ...
return ret;
}
В обоих случаях компилятор знает, что возвращаемый объект будет сейчас удален. В таких случаях компилятор осуществляет специальный вид "копирования", обсуждаемый в разделе 13.6.2.
auto_ptrПрежние версии библиотеки включали класс auto_ptr, обладавший некоторыми, но не всеми, свойствами указателя unique_ptr. В частности, невозможно было хранить указатели auto_ptrв контейнере и возвращать их из функции.
Хотя указатель auto_ptrвсе еще присутствует в стандартной библиотеке, вместо него следует использовать указатель unique_ptr.
unique_ptrПодобно указателю shared_ptr, для освобождения объекта, на который указывает указатель unique_ptr, по умолчанию используется оператор delete. Подобно указателю shared_ptr, функцию удаления указателя unique_ptr(см. раздел 12.1.4) можно переопределить. Но по причинам, описанным в разделе 16.1.6, способ применения функции удаления указателем unique_ptrотличается от такового у shared_ptr.
Переопределение функции удаления указателя unique_ptrвлияет на тип и способ создания (или переустановки) объектов этого типа. Подобно переопределению оператора сравнения ассоциативного контейнера (см. раздел 11.2.2), тип функции удаления можно предоставить в угловых скобках наряду с типом, на который может указывать указатель unique_ptr. При создании или переустановке объекта этого типа предоставляется вызываемый объект определенного типа:
// p указывает на объект типа objT и использует объект типа delT
// для его освобождения
// он вызовет объект по имени fcn типа delT
unique_ptr p(new objT, fcn);
В качестве несколько более конкретного примера перепишем программу соединения так, чтобы использовать указатель unique_ptrвместо указателя shared_ptrследующим образом:
void f(destination &d /* другие необходимые параметры */) {
connection c = connect(&d); // открыть соединение
// когда p будет удален, соединение будет закрыто
unique_ptr
p(&с, end_connection);
// использовать соединение
// по завершении f(), даже при исключении, соединение будет
// закрыто правильно
}
Для определения типа указателя на функцию используется ключевое слово decltype(см. раздел 2.5.3). Поскольку выражение decltype(end_connection)возвращает тип функции, следует добавить символ *, указывающий, что используется указатель на этот тип (см. раздел 6.7).
Упражнение 12.16. Компиляторы не всегда предоставляют понятные сообщения об ошибках, если осуществляется попытка скопировать или присвоить указатель unique_ptr. Напишите программу, которая содержит эти ошибки, и посмотрите, как компилятор диагностирует их.
Упражнение 12.17. Какие из следующих объявлений указателей unique_ptrнедопустимы или вероятнее всего приведут к ошибке впоследствии? Объясните проблему каждого из них.
int ix = 1024, *pi = &ix, *pi2 = new int(2048);
typedef unique_ptr IntP;
(a) IntP p0(ix); (b) IntP p1(pi);
(c) IntP p2(pi2); (d) IntP p3(&ix);
(e) IntP p4(new int(2048)); (f) IntP p5(p2.get());
Упражнение 12.18. Почему класс указателя shared_ptrне имеет функции-члена release()?
12.1.6. Класс weak_ptr
Класс weak_ptr(табл. 12.5) представляет интеллектуальный указатель, который не контролирует продолжительность существования объекта, на который он указывает. Он только указывает на объект, который контролирует указатель shared_ptr. Привязка указателя weak_ptrк указателю shared_ptrне изменяет счетчик ссылок этого указателя shared_ptr. Как только последний указатель shared_ptrна этот объект будет удален, удаляется и сам объект. Этот объект будет удален, даже если останется указатель weak_ptrна него. Имя weak_ptrотражает концепцию "слабого" совместного использования объекта.
Интервал:
Закладка: