Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Чтобы использовать такое имя, как j
, следует применить оператор области видимости, позволяющий указать требуемое имя. Для указания переменной j
, определенной в глобальной области видимости, нужно написать ::j
, а для определенной в пространстве имен blip
— blip::j
.
Поскольку имена находятся в разных областях видимости, локальные объявления в пределах функции manip()
могут скрыть некоторые из имен пространства имен. Локальная переменная k
скрывает член пространства имен blip::k
. Обращение к переменной k
в пределах функции manip()
вполне однозначно, это обращение к локальной переменной k
.
using
или директивыЗаголовок, содержащий директиву или объявление using
в своей области видимости верхнего уровня, вводит свои имена в каждый файл, который подключает заголовок. Обычно заголовки должны определять только те имена, которые являются частью его интерфейса, но не имена, используемые в его реализации. В результате файлы заголовка не должны содержать директив или объявлений using
, кроме как в функциях или пространствах имен (см. раздел 3.1).
using
Директивы using
, вводящие в область видимости все имена из пространства имен, обманчиво просты в использовании. Единственный оператор делает видимыми имена всех членов пространства имен. Хоть этот подход может показаться простым, он создает немало проблем. Если в приложении использовано много библиотек и директива using
сделает видимыми имена, определенные в них, то вновь возникнет проблема загромождения глобального пространства имен.
Кроме того, не исключено, что при выходе новой версии библиотеки вполне работоспособная в прошлом программа перестанет компилироваться. Причиной этой проблемы может быть конфликт имен новой версии с именами, которые использовались прежде.
Еще одна вызванная директивой using
проблема неоднозначности обнаруживается только в момент применения. Столь позднее обнаружение означает, что конфликты могут возникать значительно позже применения определенной библиотеки. То есть при использовании в программе новой библиотеки могут возникнуть не обнаруженные ранее конфликты.
Поэтому лучше не полагаться на директиву using
и использовать объявление using
для каждого конкретного имени пространства имен, используемого в программе. Это уменьшит количество имен, вводимых в пространство имен. Кроме того, ошибки неоднозначности, причиной которых является объявление using
, обнаруживаются в точке объявления, а это существенно упрощает их поиск.
Директивы
using
на самом деле полезны в файлах реализации самого пространства имен.
Упражнение 18.15. Объясните различия между объявлением и директивой using
.
Упражнение 18.16. Объясните следующий код с учетом того, что объявления using
для всех членов пространства имен Exercise
находятся в области, помеченной как позиция 1
. Что, если вместо этого они располагаются в позиции 2
? Теперь ответьте на тот же вопрос, но замените объявления using
директивой using
для пространства имен Exercise
.
namespace Exercise {
int ivar = 0;
double dvar = 0;
const int limit = 1000;
}
int ivar = 0;
// позиция 1
void manip() {
// позиция 2
double dvar = 3.1416;
int iobj = limit + 1;
++ivar;
++::ivar;
}
Упражнение 18.17. Напишите код для проверки ответов на предыдущий вопрос.
18.2.3. Классы, пространства имен и области видимости
Поиск имен, используемых в пространстве имен, происходит согласно обычным правилам поиска в языке С++: сначала во внутренней, а затем во внешней области видимости. Имя, используемое в пространстве имен, может быть определено в одном из окружающих пространств имен, включая глобальное пространство имен. Однако учитываются только те имена, которые были объявлены перед точкой использования в блоках, которые все еще открыты.
namespace A {
int i;
namespace В {
int i; // скрывает A::i в В
int j;
int f1() {
int j; // j локальна для f1() и скрывает A::B::j
return i; // возвращает B::i
}
} // пространство имен В закрыто, и его имена больше не видимы
int f2() {
return j; // ошибка: j не определена
}
int j = i; // инициализируется значением A::i
}
Когда класс расположен в пространстве имен, процесс поиска остается обычным: когда имя используется функцией-членом, его поиск начинается в самой функции, затем в пределах класса (включающий базовые классы), а потом в окружающих областях видимости, одной или несколькими из которых могли бы быть пространства имен:
namespace A {
int i;
int k;
class C1 {
public:
C1(): i(0), j(0) { } // ok: инициализирует C1::i и C1::j
int f1() { return k; } // возвращает A::k
int f2() { return h; } // ошибка: h не определена
int f3();
private:
int i; // скрывает A::i в C1
int j;
};
int h = i; // инициализируется значением A::i
}
// член f3() определен вне класса C1 и вне пространства имен A
int A::C1::f3() { return h; } // ok: возвращает A::h
За исключением определений функций-членов, расположенных в теле класса (см. раздел 7.4.1), области видимости всегда просматриваются снизу вверх: имя должно быть объявлено прежде его применения. Следовательно, оператор return
функции f2()
не будет откомпилирован. Он попытается обратиться к имени h
из пространства имен А
, но там оно еще не определено. Если бы это имя h
было определено в пространстве имен А
прежде определения класса C1
, его использование было бы вполне допустимо. Аналогично использование имени h
в функции f3()
вполне допустимо, поскольку функция f3()
определена уже после определения А::h
.
Порядок просмотра областей видимости при поиске имени определяется по полностью квалифицированному имени функции. Полностью квалифицированное имя указывает в обратном порядке области видимости, в которых происходит поиск.
Спецификаторы A::C1::f3()
указывают обратный порядок, в котором просматриваются области видимости класса и пространств имен. Первая область видимости — это функция f3()
. Далее следует область видимости ее класса C1
. Область видимости пространства имен А
просматривается в последнюю очередь, перед переходом к области видимости, содержащей определение функции f3()
.
Интервал:
Закладка: