Kniga-Online.club
» » » » Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Читать бесплатно Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп. Жанр: Программирование год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:
в цикл также пуста (""). Механизм, гарантирующий инициализацию по умолчанию, называется конструктором по умолчанию (default constructor).

К сожалению, язык С++ не предусматривает инициализацию по умолчанию для встроенных типов. Лишь глобальные переменные (см. раздел 8.4) по умолчанию инициализируются нулем, но их использование следует ограничивать. Большинство полезных переменных, к которым относятся локальные переменные и члены классов, не инициализируются, пока не указано их начальное значение (или не задан конструктор по умолчанию).

Не говорите, что вас не предупреждали! 

8.3. Заголовочные файлы

Как управлять объявлениями и определениями? Они должны быть согласованными. В реальных программах могут быть десятки тысяч объявлений; программы с сотнями тысяч объявлений тоже не редкость. Как правило, когда вы пишете программу, большинство используемых определений написано не вами. Например, реализации потока cout и функции sqrt() были написаны много лет назад кем-то другим. Мы просто используем их. Главным средством управления сущностями, определенными где-то в другом месте, в языке С++ являются заголовки. В принципе заголовок (header) — это коллекция объявлений, записанных в файле, поэтому заголовок часто называют заголовочным файлом (header file). Такие заголовки подставляются в исходные файлы с помощью директивы #include. Например, вы можете решить улучшить организацию исходного кода нашего калькулятора (см. главы 6 и 7), выделив объявления лексем в отдельный файл. Таким образом, можно определить заголовочный файл token.h, содержащий объявления, необходимые для использования классов Token и Token_stream.

Объявления классов Token и Token_stream находятся в заголовке token.h. Их определения находятся в файле token.cpp. В языке C++ расширение .h относится к заголовочным файлам, а расширение .cpp чаще всего используется для исходных файлов. На самом деле в языке С++ расширение файла не имеет значения, но некоторые компиляторы и большинство интегрированных сред разработки программ настаивают на использовании определенных соглашений относительно расширений файлов.

В принципе директива #include "file.h" просто копирует объявления из файла file.h в ваш файл в точку, отмеченную директивой #include. Например, мы можем написать заголовочный файл f.h.

// f.h

int f(int);

А затем можем включить его в файл user.cpp.

// user.cpp

#include "f.h"

int g(int i)

{

  return f(i);

}

При компиляции файла user.cpp компилятор выполнит подстановку заголовочного файла и скомпилирует следующий текст:

int f(int);

int g(int i)

{

  return f(i);

}

Поскольку директива #include выполняется компилятором в самом начале, выполняющая ее часть компилятора называется препроцессором (preprocessing) (раздел A.17).

 

 Для упрощения проверки согласованности заголовок следует включать как в исходные файлы, использующие объявления, так и в исходные файлы, содержащие определения, соответствующие этим объявлениям. Это позволяет компилятору находить ошибки на самых ранних этапах. Например, представьте себе, что разработчик функции Token_stream::putback() сделал ошибки.

Token Token_stream::putback(Token t)

{

  buffer.push_back(t);

  return t;

}

Этот фрагмент выглядит вполне невинно. К счастью, компилятор перехватывает ошибки, потому что он видит (благодаря директиве #include) объявление функции Token_stream::putback(). Сравнивая это объявление с соответствующим определением, компилятор выясняет, что функция putback() не должна возвращать объект класса Token, а переменная buffer имеет тип Token, а не vector<Token>, так что мы не можем использовать функцию push_back(). Такие ошибки возникают, когда мы работаем над улучшением кода и вносим изменения, забывая о необходимости согласовывать их с остальной частью программы.

Рассмотрим следующие ошибки:

Token t = ts.gett(); // ошибка: нет члена gett

                     // ...

ts.putback();        // ошибка: отсутствует аргумент

Компилятор немедленно выдаст ошибку; заголовок token.h предоставляет ему всю информацию, необходимую для проверки.

Заголовочный файл std_lib_facilities.h содержит объявления стандартных библиотечных средств, таких как cout, vector и sqrt(), а также множества простых вспомогательных функций, таких как error(), не являющихся частью стандартной библиотеки. В разделе 12.8 мы продемонстрируем непосредственное использование заголовочных файлов стандартной библиотеки.

Заголовки обычно включаются во многие исходные файлы. Это значит, что заголовок должен содержать лишь объявления, которые можно дублировать в нескольких файлах (например, объявления функций, классов и числовых констант). 

8.4. Область видимости

Область видимости (scope) — это часть текста программы. Каждое имя объявляется в своей области видимости и является действительным (т.е. находится в области видимости), начиная с точки объявления и заканчивая концом данной области. Рассмотрим пример.

void f()

{

  g();       // ошибка: g() не принадлежит (пока) области видимости

}

void g()

{

  f();       // OK: функция f() находится в области видимости

}

void h()

{

  int x = y; // ошибка: переменная y не принадлежит (пока)

             // области видимости

  int y = x; // OK: переменная x находится в области видимости

  g();       // OK: функция g() находится в области видимости

}

Имена, принадлежащие области видимости, видны из вложенных в нее других областей видимости. Например, вызов функции f() находится в области видимости функции g(), которая является вложенной в глобальную область видимости. Глобальная область видимости не вкладываются ни в какую другую. Правило, утверждающее, что имя должно быть объявлено до того, как будет использовано, по-прежнему действует, поэтому функция f() не может вызывать функцию g().

Существует несколько разновидностей областей видимости, которые можно использовать для управления используемыми именами.

Глобальная область видимости (global scope). Часть текста, не входящая ни в одну другую область видимости.

Пространство имен (namespace scope). Именованная область видимости, вложенная в глобальную область видимости или другое пространство имен (раздел 8.7).

Область видимости класса (class scope). Часть текста, находящаяся в классе (раздел 9.2).

• Локальная область видимости (local scope). Часть текста, заключенная в фигурные скобки, { ... }, в блоке или функции.

• Область видимости инструкции (например, в цикле for).

Основное предназначение области видимости — сохранить локальность имен, чтобы они не пересекались с именами, объявленными в другом месте. Рассмотрим пример.

void f(int x)  // функция f является глобальной;

               // переменная x является локальной в функции f

{

  int z = x+7; // переменная

Перейти на страницу:

Бьёрн Страуструп читать все книги автора по порядку

Бьёрн Страуструп - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Программирование. Принципы и практика использования C++ Исправленное издание отзывы

Отзывы читателей о книге Программирование. Принципы и практика использования C++ Исправленное издание, автор: Бьёрн Страуструп. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*