Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Программирование в Visual С++ 2005 4 страница



Рис. 2.7. Представление Class View

Существуют три способа компиляции и компоновки программы; вы можете вы-
брать пункт Build Ех2_01 (Собрать Ех2_01) в меню Build (Сборка) либо нажать функ-
циональную клавишу <F7>, или же выбрать соответствующую кнопку на линейке
инструментов — найти ее можно, перемещая курсор над кнопками с небольшой за-
держкой. Если предположить, что операция сборки программы завершилась успеш-
но, вы можете запустить программу, нажав комбинацию клавиш <Ctrl+F5> или вы-
брав пункт Start Without Debugging (Запустить без отладки) в меню Debug (Отладка).
В результате вы должны получить следующий вывод в окне командной строки:


70 Глава 2

 

Апельсины - не единственные фрукты...

- и всего у нас 11 фруктов.

Press any key to continue...

Для продолжения нажмите любую клавишу...

Первые две строки выдала программа, а последняя указывает, что вы можете за-
вершить выполнение и закрыть окно командной строки.

Комментарии к программе

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

Как видите, несколько строк в программе содержат комментарии вместе с опера-
торами самой программы. Вы также можете применять альтернативную форму ком-
ментариев, ограничивая их комбинациями символов /* и */• Например, первая стро-
ка программы могла бы выглядеть следующим образом:

 


Комментарий, начинающийся с //, включает только часть строки справа от него,
в то время как форма /*... */ определяет, что все, находящееся между /* и */, явля-
ется комментарием, и может распространяться на несколько строк. Например, впол-
не можно написать так:

Здесь все четыре строки являются комментариями. Если вы хотите выделить не-
которые строки комментариев, то всегда можете украсить их рамкой:

 


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



Директива - файлы заголовков

Вслед за начальными комментариями в программе находится директива

 


Она называется директивой, поскольку указывает компилятору сделать что-то — в
данном случае вставить содержимое файла <iostream> в программу перед ее компи-
ляцией. Файл <iostream> называется файлом заголовков, потому что обычно он по-
является в начале программного файла. В действительности точнее было бы назвать
<iostream> заголовком, так как согласно стандарту ANSI С++ заголовок не обязатель-
но должен содержаться в файле. Заголовочный файл <iostream> включает определе-


Данные, переменные и вычисления 71

 

ния, которые понадобятся вам для того, чтобы можно было использовать операторы
ввода и вывода С++. Если вы не включите в программу содержимое <iostream>, то
она не скомпилируется, поскольку вы используете в ней операторы, зависящие от не-
которых определений, находящихся в этом файле. Существует множество заголовоч-
ных файлов, поставляемых с Visual С++, которые охватывают широкий круг возмож-
ностей. Вы познакомитесь со многими из них в процессе изучения средств языка.

Оператор — это одна из директив препроцессора. Редактор Visual С++

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

Пространства имен и объявление using

Как было показано в главе 1, стандартная библиотека — это широкий набор проце-
дур, предназначенных для решения многих часто встречающихся задач: например, об-
работка ввода-вывода и выполнение базовых математических вычислений. Поскольку
существует огромное количество таких процедур, а наряду с ними — и других име-
нованных сущностей, есть вероятность, что вы можете нечаянно использовать для
собственных целей имя, совпадающее с одним из имен, определенных в стандартной
библиотеке. Пространство имен (namespace) — это механизм С++, предназначенный
для предотвращения проблем, связанных с дублированием имен, применяемых в про-
грамме для разных целей. Это делается за счет того, что определенное множество
имен вроде имен стандартной библиотеки ассоциируется с общим именем семейства,
которое и представляет собой пространство имен.

Каждое имя, определенное в коде, появляющемся внутри пространства имен,
включает в себя имя этого пространства имен. Все средства стандартной библиотеки
ISO/ANSI С++ определены внутри пространства имен по имени std, поэтому каждый
элемент стандартной библиотеки, к которому вы можете обратиться в своей програм-
ме, имеет свое собственное имя плюс наименование пространства имен — std — в ка-
честве квалификатора. Имена cout и endl определены в стандартной библиотеке,
поэтому их полные имена выглядят как , и вы видели это в

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

спечивают упомянутую возможность:

Это — объявления using, сообщающие компилятору о вашем намерении ис-
пользовать имена cout и endl из пространства имен std без указания квалификато-
ра — наименования пространства имен. После этого компилятор, встречая в тексте
программы имя cout, в соответствии с первым объявлением будет предполагать, что
вы имеете в виду cout, определенный в стандартной библиотеке. Имя cout представ-
ляет стандартный выходной поток, который по умолчанию соответствует командной
строке, а имя endl — символ новой строки.


72 Глава 2

 

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

Функция main ()

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

Как вы убедитесь, любая функция состоит из заголовка, определяющего (помимо
всего прочего) ее имя, за которым следует тело функции, включающее множество
операторов, заключенных в пару скобок. Тело функции может не содержать в себе во-
обще никаких операторов — в таком случае функция ничего не делает.

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

Операторы программы

Каждый из операторов программы, образующих тело функции main (), завер-
шается точкой с запятой. Этот символ помечает конец оператора, а не конец строки.
Следовательно, один оператор может распространяться на несколько строк, если это
помогает понять код, либо несколько операторов могут находиться в одной строке.
Оператор программы — базовый элемент, определяющий то, что делает программа.
Он в некоторой степени похож на предложение в абзаце текста, где каждое из них
выражает действие или идею, но при этом комбинируется с другими предложениями
абзаца для определения более общей идеи. Оператор — самодостаточное определение
действия, которое может выполнять компьютер, но которое может комбинироваться с
другими операторами с целью определения более сложного действия или вычисления.

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

Вот первый оператор в теле функции main ():

 

Этот оператор объявляет две переменные — apples и oranges. Переменная — это
просто именованный фрагмент памяти компьютера, который вы можете использо-
вать для сохранения данных, а оператор, представляющий имена одной или более
переменных, называется объявлением переменной. Ключевое слово int в предыду-
щем примере означает, что переменные с именами apples и oranges предназначе-
ны для хранения целочисленных значений. Везде, где в программе объявляется имя
новой переменной, всегда должен указываться вид данных, которые она может сохра-
нять, и это называется типом переменной.

Следующий оператор объявляет другую целочисленную переменную — fruit:


Данные, переменные и вычисления 73

 

Хотя и можно объявлять несколько переменных в одном операторе, как это сдела-
но в предыдущей строке с apples и oranges, обычно лучше объявлять каждую пере-
менную в отдельном операторе и в отдельной строке, чтобы можно было индивиду-
ально ее прокомментировать, описывая ее назначение.

Следующая строка в примере выглядит так:

 

Эта строка содержит два оператора, причем каждый завершается точкой с запя-
той. Я поместил их здесь просто для демонстрации, что вы можете размещать более
одного оператора в строке. Хотя это и не обязательно, но хорошим тоном в програм-
мировании считается размещение только одного оператора в строке, поскольку это
облегчает понимание кода. Хороший тон программирования предполагает такое ко-
дирование, которое упрощает понимание кода и снижает вероятность ошибок.

Два оператора в предыдущей строке сохраняют значения 5 и 6 в переменных
apples и oranges соответственно. Эти операторы называются операторами присва-
ивания, потому что они присваивают новые значения переменным, а = — это опера-
ция присваивания.

Далее идет такой оператор:

 

Это также оператор присваивания, но несколько отличающийся, поскольку справа
от операции присваивания стоит арифметическое выражение. Этот оператор скла-
дывает вместе значения, хранящиеся в переменных apples и oranges, и сохраняет
результат в переменной fruit.

Следующие три оператора:

 


Это операторы вывода. Первый из них посылает символ новой строки, отмечен-
ный словом endl, в командную строку на экране. В С++ источник ввода и место назна-
чения вывода называется потоком (stream). Имя cout специфицирует "стандартный"
выходной поток, а операция << указывает, что все, что находится справа от него,
должно быть направлено в выходной поток cout. Операция «"задает" направление
потока данных — от переменной или строки, находящейся справа, в направлении вы-
ходного места назначения, расположенного слева. Таким образом, в первом операто-
ре значение, представленное именем endl, которое означает символ новой строки,
пересылается в поток, идентифицированный словом cout. В итоге данные, передан-
ные в cout, выводятся в командной строке.

Значение имени cout и операции «определены в заголовочном файле стандарт-
ной библиотеки <iostream>, который вы добавили в код программы с помощью ди-
рективы в самом ее начале, cout — имя из стандартной библиотеки, а по-
тому относится к пространству имен std. Как я уже говорил, без директивы using
это имя не могло быть распознано компилятором, если только вы не указали бы его в
полной квалифицированной форме — . Поскольку cout предназначено для
того, чтобы представлять стандартный выходной поток, вы не должны использовать
это имя для других целей, а потому не можете применять его, например, в качестве
имени переменной. Очевидно, что использование одного и того же имени для раз-
личных вещей может стать причиной путаницы.


74 Глава 2

 

 

Второй из трех операторов вывода распространяется на две строки:

 


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

Приведенный выше оператор посылает в командную строку текст "Апельсины -
не единственные фрукты... ", за которым следует еще один символ новой строки
(endl), потом — еще одну часть текста "- и всего у нас затем значение переменной
fruit и завершающий текст " фруктов.". В такой последовательности сущностей, от-
правляемой в выходной поток, не кроется никаких проблем. Оператор выполняется
слева направо, при этом каждый элемент отправляется на cout по очереди. Обратите
внимание, что каждому отправленному на вывод элементу при этом предшествует
собственная операция «.

Третий и последний оператор вывода просто посылает на экран еще один символ
новой строки. Так эти три оператора формируют вывод программы, который вы и
наблюдаете.

Последний оператор программы выглядит следующим образом:

 


Этот оператор прекращает выполнение функции main () и завершает программу.
Управление возвращается операционной системе. Об этом операторе будет рассказа-
но позже.

Операторы программы выполняются в том порядке, в котором они записаны,
если только специальные управляющие операторы не изменяют естественный поря-
док их выполнения. В главе 3 вы ознакомитесь с операторами, изменяющими после-
довательность выполнения.

Пробелы

Пробел (whitespace) — термин, используемый в С++ для обозначения символов про-
бела, табуляции, новой строки, новой страницы и комментариев. Пробелы служат раз-
делителями одной части оператора от другой и позволяют компилятору идентифици-
ровать, где заканчивается один элемент оператора, такой как int, и начинается другой.
В остальных случаях пробелы игнорируются и никакого влияния не оказывают.

Посмотрим, к примеру, на следующий оператор:

 

Должен быть, по крайней мере, один пробельный символ (обычно — пробел) меж-
ду int и fruit, чтобы компилятор мог различить их, но если пробелов будет больше,
они игнорируются.

С другой стороны, взгляните на такой оператор:


Данные, переменные и вычисления 75

 

Ни один пробельный символ не является необходимым между fruit и =, или меж-
ду = и apples, хотя при желании вы можете их включить сюда. Дело в том, что = —
это не буква и не цифра, поэтому компилятор может отделить его от окружения.
Аналогично никакие пробельные символы не нужны вокруг знака +, но вы можете
включить их, если хотите сделать код более читабельным.

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

Блоки операторов

Вы можете заключить несколько операторов в фигурные скобки. В этом случае
они образуют блок, или составной оператор. Примером блока может служить тело
функции. Такой составной оператор можно воспринимать как единственный опера-
тор (в чем вы убедитесь, изучая управляющие операторы С++ в главе 3). Фактически,
всякий раз, когда вы помещаете отдельный оператор в С++, вы можете вместо него
использовать блок операторов в фигурных скобках. Как следствие, блоки могут быть
включены в другие блоки. Фактически блоки могут быть вложенными один в другой
на любую глубину.

 

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

 

 

Автоматически сгенерированные консольные программы

В последнем примере вы настроили проект как пустой (Empty project), без исхо-
дных файлов, а затем последовательно добавили их. Если же вы позволите мастеру
Application Wizard сгенерировать проект, как это делалось в главе 1, то проект изна-
чально будет содержать несколько файлов, и вам стоит немного глубже разобраться
в их содержимом. Создайте новый проект консольной программы Win32 по имени
, на этот раз позволив мастеру Application Wizard сделать свою работу, не
устанавливая никаких опций в диалоге Application Settings (Настройки приложения).
Проект будет включать в себя три файла с кодом: , со-

держащие исходный код, и заголовочный файл . Они предназначены для

обеспечения базовых средств, необходимых работающей консольной программе, ко-
торая не делает ничего. Если у вас есть открытый проект, вы можете закрыть его, вы-
брав пункт меню File^Close Solution (Файл1^Закрыть решение). Вы можете создать
новый проект, не закрывая старый — при этом он будет закрыт автоматически, если
только вы не предпочтете добавить новый к существующему решению.
Прежде всего, содержимое будет таким:

 

 


 


Это совершенно отличается от предыдущего примера. Присутствует директива
#include для заголовочного файла stdaf x.h, которой не было в предыдущей вер-
сии, и функция, с которой начинается выполнение программы, называется tmain (),
а не main ().

Мастер Application Wizard сгенерировал заголовочный файл stdaf х. h как часть
проекта, и если вы заглянете в его код, то увидите там еще две директивы #include
для заголовочных файлов стандартной библиотеки stdio. h и tchar. h. stdio. h — за-
головок старого стиля для ввода-вывода, который использовался до появления те-
кущего стандарта ISO/ANSI С++. Он обеспечивает ту же функциональность, что и
<iostream>. Второй файл, tchar.h, является специальным заголовочным файлом
Microsoft, определяющим некоторые текстовые функции. Идея в том, что stdaf x.h
должен определять набор стандартных системных включаемых файлов для вашего
проекта, в который директивой #include вы можете включать любые другие систем-
ные заголовочные файлы, которые понадобятся. При изучении ISO/ANSI С++ вам
не придется использовать ни один из включенных в stdafх.h заголовочных файлов,
что является одной из причин того, чтобы не применять средств генерации файлов
по умолчанию мастером Application Wizard.

Как я ранее объяснял, Visual С++ 2005 поддерживает wmain () как альтернативу
main () при написании программ, использующих символы Unicode, wmain () — специ-
фичное для Microsoft имя, которое не является частью ISO/ANSI С++. Для поддерж-
ки этого заголовок tchar.h определяет имя _tmain таким образом, что оно обычно
заменяется main, но при определении символа _UNIC0DE заменяется wmain. То есть
для того, чтобы идентифицировать программу, использующую UNICODE, вы должны
добавить следующий оператор в начало заголовочного файла stdaf x.h:

♦define _UNIC0DE

Разобравшись во всем этом, мы можем вернуться к использованию простой старой
функции main () в последующих примерах для ISO/ANSI С++.

 

Определение переменных

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

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

В следующем разделе мы поговорим о правилах именования переменных при
объявлении их в программах.


Данные, переменные и вычисления 77

 

Именованиепеременных

Имя, которое вы присваиваете переменной, называется идентификатором, или
проще — именем переменной. Имена переменных могут включать буквы A-z (в
верхнем или нижнем регистре), цифры 0-9 и знаки подчеркивания. Никакие дру-
гие символы не допускаются, и если вы нечаянно укажете какой-то другой символ,
то получите сообщение об ошибке при попытке скомпилировать программу. Имена
переменных должны начинаться либо с буквы, либо с подчеркивания. Обычно выбор
имен переменных обусловлен видом хранимой в них информации.

Поскольку имена переменных в Visual С++ 2005 могут иметь длину до 2048 сим-
волов, вам предоставляется достаточно свободы в именовании ваших переменных.
Фактически, помимо переменных есть несколько других вещей в С++, которые име-
ют собственные имена, и они тоже могут содержать до 2048 символов, подчиняясь
тем же правилам, что и имена переменных. Применение имен максимальной длины
может затруднить чтение ваших программ, и если только у вас нет изумительных на-
выков работы на клавиатуре, их очень трудно набирать. Но более серьезное обстоя-
тельство, которое следует принять во внимание при выборе имен — это то, что не все
компиляторы поддерживают такие длинные имена. Если вы намереваетесь компили-
ровать свой код в других средах, то желательно ограничиться именами не длиннее 31
символа. Обычно этого достаточно, чтобы выбирать осмысленные значащие имена,
и позволяет избежать проблем, связанных с ограничениями на длину имен, присущи-
ми другим компиляторам.

Хотя разрешается использовать имена переменных, начинающиеся со знака под-
черкивания, например, this и _that, все же этого лучше избегать, потому что это
чревато потенциальными конфликтами со стандартными системными переменными,
имеющими такую же форму. По той же причине следует избегать применения имен
переменных, начинающихся с двух знаков подчеркивания.

Ниже представлены примеры хороших имен переменных.

 

 


Имена вроде 8_Ball, 7Up и б_раск не допускаются, равно как и Hash! или
МагS-Ann. Последний пример демонстрирует распространенную ошибку, хотя имя
MaryAnn со знаком подчеркивания вместо тире вполне приемлемо. Конечно, Магу
Ann — тоже неправильно, поскольку пробелы в именах переменных не разрешены.
Обратите внимание, что имена переменных republican и Republican трактуются
как различные, потому что имена переменных зависят от регистра, то есть символы
верхнего и нижнего регистра различаются. Конечно, пробельные символы вообще
не могут появляться в именах, и если вы нечаянно включите пробельные символы,
то получите два или более имен вместо одного, что обычно заставляет компилятор
выдавать соответствующее сообщение.

Обычное соглашение, принятое в С++, заключается в том, что имена, начинающи-
еся с заглавных букв, резервируются для именования классов, а начинающиеся с про-
писных — для именования переменных. О классах речь пойдет в главе 8.


78 Глава 2

 

Ключевые слова в С++

В С++ присутствуют зарезервированные слова, которые называются ключевыми
словами и имеют специальное значение внутри языка. Редактор Visual С++ 2005 под-
свечивает их определенным цветом, когда вы вводите текст программы — в моей систе-
ме по умолчанию они окрашены в синий цвет. Если ключевое слово, которое вы ввели,
не окрашивается соответствующим образом — значит, вы ввели его неправильно.

Помните, что ключевые слова, как весь язык С++, зависят от регистра. Например,
программа, которую вы набирали ранее, содержит ключевые слова int и return.
Если бы вы написали Int или Return, то это не считалось бы ключевыми словами,
и компилятор не распознал бы их как таковые. В процессе дальнейшего изучения вы
познакомитесь и со многими другими ключевыми словами С++. Необходимо обеспе-
чивать, чтобы имена, которые вы выбираете для сущностей в своих программах, не
совпадали ни с одним ключевым словом С++. Полный список ключевых слов Visual
С++ 2005 приведен в приложении А.

Объявление переменных

Как вы уже видели, объявление переменной — это оператор программы, который
специфицирует имя переменной данного типа, например:

int value;

Это объявляет переменную по имени value для хранения целых чисел. Тип дан-
ных, который может быть сохранен в переменной value, указан ключевым словом
int, поэтому value вы можете применять только для хранения данных типа int.
Поскольку int — ключевое слово, его нельзя использовать в качестве имени ни одной
из ваших переменных.


Дата добавления: 2015-11-04; просмотров: 20 | Нарушение авторских прав







mybiblioteka.su - 2015-2024 год. (0.026 сек.)







<== предыдущая лекция | следующая лекция ==>