PVOID - Структура программы

Этот раздел является переводом туториала C++ Language


   Лучший способ изучения языка программирования - это написание программ. Обычно первая программа, написанная новичком, называется "Hello, World", которая просто выводит "Hello, World" на экран. Несмотря на то что она очень простая, программа содержит все основные компоненты программы на C++:

// моя первая программа на C++
#include <iostream>

int main()
{
  std::cout << "Hello World!";
}
Hello World!

   Верхняя панель показывает код программы. На нижней панели отображен результат запуска программы. Серые цифры слева от панелей - это номера строк для того, чтобы было легче обсуждать программы и искать ошибки. Они не являются частью программы.

Исследуем каждую строку программы:

Строка 1: // моя первая программа на C++

Два слэша (//) показывают, что последующая часть строки является комментарием, добавленным программистом, однако не влияющим на выполнение программы. Программисты используют их для включения небольших объяснений или наблюдений относительно программного кода. В данном случае - это краткое описание программы.

Строка 2: #include <iostream>

Строки, начинающиеся с решетки (#), указывают на то, что читать и интерпретировать их будет препроцессор. Это специальные строки, интерпретируемые перед началом компиляции программ. В данном случае директива #include <iostream> указывает препроцессору включить фрагмент кода на C++, известного как заголовочный файл iostream, который позволяет использовать операторы стандартного ввода/вывода, такие как запись вывода этой программы (Hello, World) на экран.

Строка 3: пустая строка.

Пустые строки не влияют на программу. Они просто улучшают читаемость кода.

Строка 4: int main()

Эта строка содержит объявление функции. По существу, функция - это группа выражений, которым присвоено имя: в данном случае это имя "main", присвоенное группе последующих строк. Функции будут подробно рассмотрены в следующей главе, но фактически их определение начинается с последовательности типа (int), имени (main) и пары круглых скобок (), при необходимости включающих параметры.

Функция, называемая main, это специальная функция во всех программах на C++; это функция, вызываемая при запуске программы. Выполнение всех программ на C++ начинается с функции main, независимо от того, где эта функция фактически расположена в коде.

Строки 5 и 7: { и }

 Открывающая фигурная скобка ({) в строке 5 обозначает начало определения функции, а закрывающая (}) в строке 7 его конец. Все, что находится между этими скобками - это тело функции, которое определяет, что произойдет, когда main будет вызвана. Все функции используют фигурные скобки для обозначения начала и конца их определения.

Строка 6: std::cout << "Hello, World!";

Это выражение имеет три части: первая, std::cout, определяет устройство стандартного символьного вывода (standard character output). Обычно это экран монитора. Вторая - оператор вставки (<<), который обозначает то, что следующее за ним выражение будет вставлено в std::cout. Наконец, последовательность в кавычках ("Hello, World!") это содержимое, вставляемое в стандартный вывод.

Отметим, что выражение заканчивается точкой с запятой (;). Этот символ означает конец выражения. Все выражения должны заканчиваться точкой с запятой. Одна из наиболее частых синтаксических ошибок в C++ - это отсутствие точки с запятой в конце выражения.

   Возможно, Вы заметили, что не все строки этой программы выполняют действия при запуске программы. Это строка, содержащая комментарий (начинающаяся с //). Это строка с директивой препроцессора (начинающаяся с #). Это строки, определяющие функцию (в данном случае, функцию main). И, наконец, строка с выражением, заканчивающаяся точкой с запятой (вставка в cout), которая находится внутри блока между фигурными скобками. ({}) функции main.

   Программа структурирована в различных строках с использованием отступов таким образом, чтобы человеку было проще и понятнее ее читать. Однако C++ не имеет строгих правил на использование отступов или размещение инструкций на различных строках. Например, вместо:

int main ()
{
  std::cout << " Hello World!";
}

  мы можем написать:

int main () { std::cout << "Hello World!"; }

все на одной строке, и это будет означать то же самое, что и предыдущий фрагмент.

   В C ++ разделение выражений определяется  точкой с запятой (;) в конце, разделение на строки не имеет к этому отношения. Несколько выражений могут быть написаны на одной строке, или каждое выражение может быть на отдельной строке. Разделение кода на разные строки нужно только для того, чтобы сделать его более четким и схематичным для людей, которые будут читать его, но не влияет на фактическое поведение программы.

Теперь давайте добавим дополнительное выражение в нашу первую программу:

// моя вторая программа на C++
#include <iostream>

int main()
{
  std::cout << "Hello World! ";
  std::cout << "I'm a C++ program";
}
Hello World! I'm a C++ program

   В этом случае программа выполняет две вставки в std::cout в двух различных выражениях. Опять же разделение кода на разные строки просто дает лучшую  удобочитаемость программе, так как функция main вполне корректно может быть определена и следующим образом:

int main () { std::cout << " Hello World! "; std::cout << " I'm a C++ program "; }

 Исходный код может быть также разделен на большее количество строк:

int main ()
{
  std::cout <<
    "Hello World!";
  std::cout
    << "I'm a C++ program";
}

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

   Директивы препроцессора (те, которые начинаются с #) находятся вне этого общего правила, так как они не являются выражениями. Это строки, читаемые и обрабатываемые препроцессором прежде, чем начнется компиляция. Директивы препроцессора должны быть определены каждая на отдельной строке и, так как это не выражения, не должны заканчиваться точкой с запятой (;).

Комментарии


   Как отмечено выше, комментарии не влияют на выполнение программы; однако, они предоставляют важный инструмент для документирования непосредственно в исходном коде, чтобы описать то, что программа делает и как работает.

C++ поддерживает два вида комментариев:

// line comment
/* block comment */

   Первый из них, известный как строка комментария, исключает из обработки все, что находится после пары знаков слэша (//), до конца этой строки. Второй, известный как блок комментариев, исключает из обработки все, что между символами /* и первым включением символов */ с возможностью включения множества строк.

Давайте добавим комментариев в нашу вторую программу:

/* моя вторая программа на C++
   с множеством комментариев */

#include <iostream>

int main ()
{
  std::cout << "Hello World! ";     // печатает Hello World!
  std::cout << "I'm a C++ program"; // печатает I'm a C++ program
}
Hello World! I'm a C++ program

   Если комментарии включены в исходный код программы без использования комбинации символов комментария // , /* или */, компилятор рассматривает их, как будто они являются выражениями C++, что наиболее вероятно приведет к одной или нескольким ошибкам компиляции.

Using namespace std


   Если вы видели код C++ прежде, вы, возможно, видели, что вместо std::cout используется cout. Это имена одного и того же объекта: в первом случае используется неполное имя (cout), а во втором случае обращение к объекту происходит через пространство имен std (как std::cout).

cout - это часть стандартной библиотеки, и все элементы стандартной библиотеки C++ определены внутри того, что называется пространством имен: пространство имен std.

   Чтобы обратиться к элементам в пространстве имен std, программа должна либо указать на использование элементов библиотеки при каждом обращении (как мы делали ранее, используя cout с префиксом std::), либо обеспечить видимость ее компонентов. Типичный способ обеспечения видимости этих компонентов - использование директивы using:

using namespace std;

   Эта директива предоставляет доступ ко всем элементам в пространстве имен std без использования префикса std:: .

С учетом вышесказанного, последний пример может быть переписан так, чтобы использовать неполное имя cout :

// моя вторая программа на C++
#include <iostream>
using namespace std;

int main ()
{
  cout << "Hello World! ";
  cout << "I'm a C++ program";
}
Hello World! I'm a C++ program

   Оба способа доступа к элементам пространства имен std (явное указание и директива using) корректны в C++, и поведение программы будет одинаково для обоих способов.

   Для простоты и улучшения читаемости в примерах этого руководства чаще будет использоваться второй подход с использованием директивы using, хотя стоит отметить, что явное указание полного имени - единственная гарантия того, что конфликта имен никогда не произойдет.

Пространства имен будут обсуждаться более подробно в следующих главах.