1 Приступаем к изучению языка C++ В этой главе рассматривается следующие вопросы: Как создавать программы на C++ Общий формат программ на C++ Директива.

Презентация:



Advertisements
Похожие презентации
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Advertisements

Объектно-ориентированный язык программирования. Переменная - эта поименованная ячейка памяти, хранящая какое-либо одно значение (одно число, один фрагмент.
Лекция 4 Программирование на Паскале. Элементы языка Турбо Паскаль 7.0. Типы данных. Управляющие конструкции.
Теперь, когда вы постигли азы программирования, будем учиться писать программы, которые позволяют вести диалог между компьютером и человеком (пользователем).
План-конспект урока (информатика и икт, 9 класс) по теме: Переменные:тип, имя, значение
Работа с файлами Сазонов Д.О. ПМиЭММ Часть 2. Тема занятия: Работа с файлами через потоки Для реализации файлового ввода/вывода, необходимо включить в.
Циклы в C++. Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. В этом уроке мы научимся программировать.
АЛГОРИТМИЗАЦИЯ. Алгоритм Алгоритм – описание конечной последовательности действий, приводящей от исходных данных к нужному результату. Где встречаются.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Переменные и операторы УРОК 2. Переменные ПЕРЕМЕННАЯ – ?... контейнер для хранения данных. Переменная имеет имя – это….? последовательность букв, цифр.
Часть 1 Простейшая программа Программа на языке QBASIC состоит из последовательности инструкций – команд компилятору. Если в строке записано несколько.
Тип, имя и значение переменной.. Переменные. В объектно-ориентированных языках программирования, и в частности в языке Visual Basic, переменные играют.
Основы информатики Лекция. Функции Заикин Олег Сергеевич
Переменная - это величина, которая имеет имя, тип и значение. Значение переменной может меняться во время выполнения программы. В компьютерах каждая переменная.
1 Глава 2 Введение в программирование на С Введение 2.2 Простая программа на C Program: Печатаем строку текста 2.3 Другая простая программа на C:
Первые шаги Компилятор. высокоуровневый язык программирования общего назначения. Один из наиболее известных языков программирования, широко применяется.
Pascal 1 Основы языка Паскаль Информатика и ИКТ Смирнов М.В. МКО ООШ п. Климковка Белохолуницкого района Кировской области.
Познакомиться с основными понятиями языка Pascal 2.
Лекция 2 Функции библиотек языка C. stdio.h Заголовочный файл стандартной библиотеки языка C. Содержит определения констант, объявления функций и типов.
1 Первая программа на языке Паскаль в среде Турбо Program name_program; Var ; {здесь описываются все идентификаторы: константы, переменные, типы, процедуры,
Транксрипт:

1 Приступаем к изучению языка C++ В этой главе рассматривается следующие вопросы: Как создавать программы на C++ Общий формат программ на C++ Директива #include Функция main () Как использовать объект cout для вывода данных Как размещать комментарии в программах C++ Символ новой строки \n Как объявлять и применять переменные Как использовать объект cin для ввода данных Как определять и применять простые функции

2 Начальные сведения о языке C++ Начнем с простой программы C++, которая выводит на экран сообщение. Для вывода символов в программе из листинга 2.1 используется конструкция cout (произносится си-аут) языка C++. Исходный код содержит несколько комментариев для читателя (они начинаются с символов //; компилятор комментарии игнорирует). Язык С++ -чувствителен к регистру. Другими словами, в нем различаются символы верхнего и нижнего регистров. Следует быть внимательным и использовать тот же регистр, что и в примерах. Например, в программе встречается слово cout. Если заменить его словом Cout или соит, компилятор не воспримет его и сообщит об использовании неизвестного идентификатора. (Компилятор также не допускает орфографических ошибок, поэтому не стоит вводить kout или coot.) Для обозначения программы на C++ обычно применяется расширение.ссср. Однако, как упоминалось в лекции 1, может потребоваться использовать другое расширение.

3 Начальные сведения о языке C++ Листинг 2.1. Программа myfirst.cpp // программа myfirst.cpp отображает на экране сообщение #include // директива препроцессора using namespace std; // включает в программу определения int main() // заголовок функции { // начало тела функции cout « "Come up and C++ me some time.";// сообщение cout « "\n"; // начать новую строку return 0; // завершение функции main() } // конец тела функции

4 Начальные сведения о языке C++ Тех, кто ранее программировал на С, может удивить присутствие cout вместо функции printf(). Конечно, в языке C++ не возбраняется применять функции printf(), scanf () и все остальные функции ввода и вывода стандартного языка С при условии, что будет включен обычный файл stdio.h этого языка. Но наш курс посвящен языку C++, так что целесообразнее использовать новые средства ввода языка C++, которые во многих отношениях лучше, чем их аналоги в языке С.

5 Функция main() Учебная программа, представленная в листинге 2.1, имеет следующую структуру: int main () { операторы return 0; } Эти строки во-первых, означают, что перед нами функция с именем main(), и, во-вторых, они содержат описание работы этой функции. Вся совокупность приведенных выше строк составляет определение функции. Это определение состоит из двух частей: первой строки int main(), которая называется заголовком функции, и остальной части, заключенной в фигурные скобки ({ и }), которая является телом функции. На рис. 2.1 изображена функция main ().

6 Функция main()

7 Заголовок функции в роли интерфейса Синтаксис языка C++ требует, чтобы определение функции main() начиналось со следующего заголовка: int main(). Более подробно синтаксис заголовков функций будет рассмотрен ниже, а сейчас мы сделаем несколько предварительных замечаний. В общем случае функция C++ активизируется или вызывается другой функцией, а заголовок функции описывает интерфейс между нею и той функцией, которая ее вызывает. Слово, стоящее перед именем функции, называется возвращаемым типом функции; оно описывает информацию, передаваемую из функции обратно в ту функцию, которая ее вызвала.

8 Заголовок функции в роли интерфейса Информация в круглых скобках, следующих за именем функции, называется списком аргументов или списком параметров. Этот список содержит описание информации, передаваемой из вызывающей в вызываемую функцию. Применительно к функции main () описанный выше общий формат функции может несколько обескуражить: ведь main() обычно не вызывается из других частей программы. Но здесь все верно: main(), как правило, вызывается кодом начальной загрузки, который добавляется в программу компилятором для связи программы с операционной системой (UNIX, Windows и т.п.). По существу, заголовок функции описывает интерфейс между функцией main() и операционной системой.

9 Заголовок функции в роли интерфейса Заголовок int main () означает, что функция main() может возвращать целочисленное значение функции, которая ее вызвала, и не принимает от нее никакой информации. Во многих существующих программах используется классический заголовок языка С: main ()// первоначальный стиль языка С Если в языке С возвращаемый тип в заголовке функции опускается, то это означает, что функция имеет возвращаемый тип int. Однако в языке C++ такая форма выходит из употребления.

10 Заголовок функции в роли интерфейса Можно также использовать следующий вариант: int main(void) // излишне явный стиль Использование в круглых скобках ключевого слова void это явный способ указания на то, что функция не принимает аргументов. Пустые круглые. Некоторые программисты используют следующий заголовок, опуская оператор возврата: void main () Это логично, так как возвращаемый тип void означает, что функция не возвращает никакого значения. Данный вариант используется достаточно часто; однако в некоторых системах он не работает, поскольку не определен как обязательный в существующих на сегодняшний день стандартах.

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

12 Препроцессор C++ и файл iostream Если в программе должны использоваться обычные средства ввода или вывода языка C++, в нее необходимо включить следующие две строки: #include using namespace std; Если компилятору не понравятся эти строки (например, он сообщит, что не может найти файл iostream), попробуйте заменить их одной строкой: #include // совместимо с компиляторами // более ранних версий Фактически это все, что необходимо знать программисту для того, чтобы его программы работали; однако мы рассмотрим данный вопрос несколько подробнее.

13 Препроцессор C++ и файл iostream При создании исполняемого кода программ на C++, так же, как и в случае с про­ граммами С, используется препроцессор. Это программа, которая обрабатывает исходный файл перед основной компиляцией (как уже упоминалось в главе 1, в некоторых реализациях C++ используется транслирующая программа, которая преобразует программу на C++ в программу на С. Хотя транслятор это тоже разновидность препроцессора, мы его здесь не рассматриваем; мы рассматриваем препроцессор, который обрабатывает директивы, начинающиеся с символа #.) Чтобы вызвать этот препроцессор, не надо делать ничего особенного: он запускается автоматически при компиляции программы. В листинге 2.1 используется директива #include: #include // директива ПРЕПРОЦЕССОРА Эта директива указывает препроцессору добавить в программу содержимое файла iostream. Добавление или изменение текста в исходном коде перед компиляцией типичное для препроцессора действие.

14 Препроцессор C++ и файл iostream Отсюда возникает вопрос: почему в программу необходимо добавлять содержимое файла iostream? Это обусловлено характером передачи данных между программой и внешним миром. Буквы io в слове iostream означают ввод (input) данных в программу и вывод (output) данных из программы. Схема ввода/вывода в языке C++ включает в себя несколько определений, которые находятся в файле iostream. Вашей программе необходимы эти определения, чтобы с помощью конструкции cout отобразить на экране сообщение. Директива #include инициирует передачу в компилятор содержимого файла iostream вместе с содержимым исходного файла. В сущности, содержимое файла iostream заменяет в программе строку #include. Исходный файл не изменяется, а объединенный файл, созданный из исходного файла и файла iostream, обрабатывается на следующем этапе компиляции.

15 Имена заголовочных файлов Файлы, такие как iostream, называются включаемыми (include files, поскольку они включаются в другие файлы) или заголовочными файлами (поскольку они включаются в начало файла). В поставку компиляторов C++ включается некоторое количество заголовочных файлов, каждый из которых поддерживает отдельное семейство программных средств. Заголовочные файлы в языке С традиционно имеют расширение h, это самый простой способ идентификации типа файла по его имени. Например, заголовочный файл math.h поддерживает различные математические функции языка С. В языке C++ первоначально была принята такая же система именования. Например, заголовочный файл, поддерживающий ввод и вывод, был назван iostream.h. В табл. 2.1 приводятся правила именования заголовочных файлов.

16 Имена заголовочных файлов

17 Пространства имен Если вместо файла iostream.h вы используете файл iostream, то, чтобы определения в этом файле были доступны вашей программе, необходимо также использовать директиву для пространства имен: using namespace std; Она называется директивой использования (using directive). Проще всего принять это как данность и пока что не ломать себе лишний раз голову. Однако чтобы не оставлять Вас совсем уж в полном неведении, приведем краткое пояснение.

18 Пространства имен Пространство имен это новая функциональная возможность языка C++, предназначенная для упрощения создания программ, в которых объединяются готовые коды программ от разных поставщиков. Одна из возможных проблем заключается в том, что в двух используемых пакетах программных продуктов могут присутствовать функции с одинаковыми именами, например, с именем wanda(). Если затем в своей программе вы используете функцию wanda(), то компилятор не будет знать, какую именно версию вы имеете в виду. Пространство имен дает возможность поставщику помещать свои продукты в программный модуль, называемый областью имен, а программисту использовать имена из этой области, чтобы указать, продукт какого разработчика ему необходим.

19 Пространства имен Таким образом, компания Microflop Industries может поместить свои определения в пространство имен Microflop. Тогда обозначение Microflop: :wanda() станет полным именем для функции wanda() этой компании. Аналогично этому имя Piscine: :wanda() будет обозначать версию функции wanda() от компании Piscine Corporation. Тогда в программе можно использовать эти пространства имен, чтобы отличать друг от друга разные функции с одинаковыми именами: Microflop::wanda("go dancing?"); //использовать версию из //области имен Microflop Piscine::wanda("a fish named Desire") //использовать версию //из области имен Piscine

20 Пространства имен Точно так же классы, функции и переменные, являющиеся стандартными компонентами компиляторов C++, сейчас помещаются в пространство имен, которое называется std. Это справедливо при применении заголовочных файлов без расширения h. Например, используемая для вывода данных переменная cout, определение которой находится в файле iostream, в действительности называется std::cout.

21 Пространства имен Однако вряд ли кого-либо из пользователей обрадует перспектива преобразовывать свои коды программ с файлом iostream.h и именем cout, но без пространств имен, в коды программ с файлом iostream и именем std::cout, но с пространствами имен. Вот тут-то и приходит на помощь директива using. Смысл приведенной ниже директивы заключается в том, что имена, определенные в пространстве имен std, можно использовать без префикса std:: : using namespace std;

22 Пространства имен В результате применения такой директивы using все имена пространства имен std становятся доступными. Однако этот подход сейчас принято считать способом работы для ленивых. Предпочтительнее объявлять с помощью директивы using лишь те имена, что необходимы программе: using std::cout; // имя cout становится доступным using std::cin; // имя cin становится доступным Эти строки можно включить в начало файла вместо директивы Using namespace std; // ленивый подход, все имена доступны В этом случае имена cin и cout можно будет применять без префикса std::.

23 Вывод данных в языке C++ с использованием объекта cout Теперь рассмотрим вывод сообщения на экран. В программе myfirst.cpp для этого используется следующий оператор C++: cout « "Come up and C++ me some time."; Информация, заключенная в двойные кавычки, является сообщением, которое должно быть выведено на экран. В языке C++ любая последовательность символов, заключенная в двойные кавычки, называется строкой символов главным образом потому, что она состоит из нескольких символов, соединяемых вместе в более крупный блок.

24 Вывод данных в языке C++ с использованием объекта cout Обозначение << указывает на то, что этот оператор отправляет данную строку в объект cout. Эти символы указывают направление потока информации. А что представляет собой объект cout? Это предопределенный объект, способный отображать на экране разнообразные данные строки, числа и отдельные символы (напомним, что объект является экземпляром класса, а класс определяет способ хранения и использования данных).

25 Вывод данных в языке C++ с использованием объекта cout Чтобы применять объекты, не требуется разбираться в их внутренней "кухне". Все, что необходимо для этого знать это интерфейс объекта или, другими словами, как пользоваться объектом. Объект cout имеет простой интерфейс. Если переменная string представляет собой строку, то для ее отображения на экране можно применить следующий оператор: cout « string; Выходные данные являются потоком, другими словами, последовательностью символов, исходящих из программы. Этот поток представляет объект cout, свойства которого определены в файле iostream. К свойствам объекта cout относится операция вставки (<<), в результате которой информация справа от угловых скобок вставляется в поток.

26 Вывод данных в языке C++ с использованием объекта cout

27 Символ новой строки (\n) Теперь более внимательно рассмотрим странного вида запись во втором операторе вывода: cout «\n"; В языке C++ (и в языке С тоже) комбинация символов \n является специальной формой записи важного понятия, называемого символом новой строки. Хотя символ новой строки состоит из двух символов (\ и n), они считаются единым символом.

28 Символ новой строки (\n) C помощью конструкции cout автоматического перехода на начало следующей строки не происходит. Поэтому после первого оператора cout в листинге 2.1 курсор остается на позиции, следующей за точкой в конце строки. Чтобы установить курсор на начало следующей строки, необходимо вывести символ новой строки, или вставить символ новой строки в выходной поток. Символ новой строки можно применять так же, как и любой другой обычный символ. В программе из листинга 2.1 этот символ выводится в виде отдельной строки, но его можно было бы вывести и в составе первой строки. Таким образом, два оператора вывода можно заменить следующим оператором: cout « "Come up and C++ me some time.\n";

29 Символ новой строки (\n) Символ новой строки можно поместить даже в середину строки. Например, рассмотрим следующий оператор: cout « "I am a mighty stream\nof lucid\n clarity.\n"; Каждый символ новой строки вызывает перемещение курсора на начало следующей, в результате чего выходные данные будут выглядеть на экране следующим образом: I am a mighty stream of lucid clarity.

30 Форматирование исходного кода C++ В некоторых языках программирования, например в языке FORTRAN, в одной строке может находиться только один оператор. В таких языках для разделения операторов служит символ возврата каретки. Однако в C++ конец каждого оператора обозначается точкой с запятой. Поэтому в языке C++ символ возврата каретки можно трактовать таким же образом, как и символ пробела или табуляции. Это означает, что один оператор может занимать несколько строк, а в одной строке может находиться несколько операторов. Например, программу myfirst.cpp можно переформатировать следующим образом: #include using namespace std; int main () { cout « "Come up and C++ me some time."; cout « "\ n"; return 0; } Такой код не совсем удобочитаем, однако допустим.

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

32 Форматирование исходного кода C++ Неделимые элементы строки кода программы называются лексемами рис. 2.3

33 Форматирование исходного кода C++ Обычно одна лексема должна отделяться от другой символом пробела, табуляции или возврата каретки, у которых есть общее название пробельные символы. Некоторые одиночные символы, например круглые скобки и запятые, являются лексемами, которые не требуется отделять пробельными символами. returnO;// НЕДОПУСТИМО, должно быть return 0; return (0);//ДОПУСТИМО, пробельные символы опущены return (0) ;// ДОПУСТИМО, используется символ пробела int main ()// ДОПУСТИМО, пробельные символы опущены int main ( )// ТАКЖЕ ДОПУСТИМО, хотя используются пробелы

34 Стиль форматирования исходного кода программ на C++ Большинство программистов придерживаются стиля, который можно охарактеризовать следующими правилами: В строке присутствует один оператор Открывающая и закрывающая фигурные скобки для функции располагаются каждая в отдельной строке Операторы функции располагаются с отступом от фигурных скобок Символы пробела не ставятся с обеих сторон круглых скобок, следующих за именем функции

35 Дополнительные сведения об операторах языка C++ Программа на C++ представляет собой совокупность функций, а каждая функция это совокупность операторов. Язык C++ содержит несколько видов операторов. Рассмотрим некоторые из них. В листинге 2.2 содержатся два новых вида операторов. Во-первых, оператор объявления создает переменную. Во-вторых, оператор присваивания присваивает этой переменной некоторое значение. Кроме того, в программе показаны новые возможности объекта cout.

36 Дополнительные сведения об операторах языка C++

37 Дополнительные сведения об операторах языка C++ Объявление переменных от остальной части программы отделяется пустой строкой. В результате выполнения программы получается следующий результат: My cat has 3 fleas.

38 Операторы объявления и переменные Для хранения в компьютере какого-либо элемента информации необходимо указать, в каком месте памяти он будет храниться, а также объем области памяти, требуемой для его хранения. В языке C++ это можно сделать относительно легко с помощью оператора объявления, в котором указываются тип запоминаемой информации и идентификатор для выделяемой области памяти. Например, в программе имеется такой оператор объявления (обратите внимание на точку с запятой): int fleas;

39 Операторы объявления и переменные Этот оператор выделяет в памяти достаточно места для хранения информации, тип которой обозначается словом int. Всю работу по выделению области памяти и присвоению ей идентификатора выполняет компилятор. В языке C++ можно обрабатывать данные нескольких видов (типов), a int относится к основным типам. Он соответству­ет целому числу, т.е. числу без дробной части. Данные типа int в языке C++ могут быть положительными и отрицательными, а диапазон значений зависит от реализации языка. Данные типа int и других основных типов подробно рассматриваются в последующих лекциях. Помимо типа данных оператор объявления также указывает, что для идентификации значения в этой области памяти программа, начиная с данного момента, будет использовать имя fleas. Поскольку это значение может изменяться, fleas называется переменной. В языке C++, требуется объявлять все переменные. Если в программе fleas.cpp опустить объявление этой переменной, то при попытке использовать далее в программе переменную fleas компилятор выдаст сообщение об ошибке.

40 Операторы объявления и переменные В общем случае объявление указывает тип данных, которые будут храниться в выделяемой области памяти, а также имя, используемое программой для обозначения этих данных. В данном случае программа создает переменную с именем fleas, в которой может хра­ниться целое число (рис. 2.4).

41 Оператор присваивания Оператор присваивания присваивает значение некоторой области памяти. Например, оператор fleas =38; присваивает целое число 38 области памяти, представленной переменной fleas. Знак = обозначает операцию присваивания. В языке C++ имеется одна необычная особенность: операцию присваивания можно использовать последовательно. Таким образом, следующий код допустим: int steinway; int baldwin; int yamaha; yamaha = baldwin = steinway = 88;

42 Важный момент, связанный с объектом cout В приводившихся до сих пор примерах объекту cout для вывода на печать передавались строки. Но в листинге 2.2 этому объекту уже передается переменная, значением которой является целое число: cout « fleas; Теперь программа вместо слова fleas выведет на печать целочисленное значение, хранящееся в переменной fleas (оно равно 38). Фактически здесь важны даже не один, а два момента. Во-первых, объект cout замещает имя переменной fleas ее текущим числовым значением 38. Во-вторых, это значение преобразуется в соответствующие символы, выводимые на экран.

43 Важный момент, связанный с объектом cout Как видим, объект cout может работать как со строками, так и с целыми числами. Возможно, в этом и нет ничего особенного, но следует обратить внимание на следующее: целое число 38 представляет собой нечто совсем иное, чем строка "38". Строка содержит символы, посредством которых записывается это число: символ 3 и символ 8. В памяти компьютера хранится код символов 3 и 8. Чтобы вывести на печать строку, объект cout просто отображает каждый ее символ. Совсем другая история с целым числом 38: оно хранится как числовое значение не каждая цифра числа отдельно, а в виде двоичного числа. Главное здесь заключается в том, что объект cout перед выводом на печать должен преобразовать целое число в символьную форму. Более того, объект cout обладает способностью определять, что переменная fleas представляет собой целое число, требующее преобразования. Попробуем провести сопоставление с языком С, чтобы показать, насколько объект cout "умнее" функции printf (). Чтобы вывести на печать строку "38" и целое число 38, в языке С используется многоцелевая функция вывода printf () :

44 Важный момент, связанный с объектом cout He вдаваясь во все сложности работы функции printf (), заметим, что для указания, что следует печатать строку или целое число, необходимо использовать специальные коды (%s и %d). Если функции printf () указано печатать строку, а вместо строки ей по ошибке передано целое число, то функция printf () этой ошибки не заметит. Она просто выполнит свою работу и отобразит на экране информационный мусор. Объект cout действует более разумно, что является результатом объектно-ориентированных свойств языка C++. По сути, операция вставки в языке C++ выполняется по-разному в зависимости от типа данных, следующих за знаком этой операции (<<).

45 Еще несколько операторов языка С ++ Рассмотрим еще несколько примеров операторов. Программа из листинга 2.3 является расширением предыдущего примера, она позволяет вводить данные во время выполнения программы. Для этого в ней используется объект cin (произносится си-ин) объект, по своему назначению противоположный cout. Он служит для ввода данных. Кроме того, здесь показан еще один способ применения объекта cout этого мастера перевоплощений, где три оператора вывода объединяются в один.

46 Еще несколько операторов языка С ++

47 Применение объекта cin Из вывода программы видно, что значение, вводимое с клавиатуры (112), присваивается переменной fleas. Вот оператор, который совершает это чудо: cin » fleas; Подобно тому как вывод данных рассматривается в языке C++ как поток символов, исходящих из программы, ввод данных рассматривается как поток символов, поступающих в программу.

48 Применение объекта cin Согласно определению, находящемуся в файле iostream, объект cin представляет собой этот поток. Чтобы обеспечить вывод данных на печать, операция ( >), чтобы извлечь символы из входного потока. Как правило, справа от знака этой операции находится переменная, принимающая извлекаемую информацию (обозначения « и » были выбраны, чтобы визуально показать направление потока информации). Подобно объекту cout, объект cin - довольно "разумный". Он преобразует входные данные, которые представляют собой просто последовательность символов, вводимых с клавиатуры, в форму, приемлемую для переменной, принимающей информацию. В данном случае переменная fleas объявлена в программе как целочисленная, поэтому входные данные преобразуются в числовую форму, используемую компьютером для хранения целых чисел.

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

50 Несколько слов о классах Данный оператор создает некоторую переменную (fleas), обладающую свойствами данных типа int. Это значит, что переменная fleas может содержать целое число и использоваться для определенных целей, например, для сложения и вычитания. Теперь рассмотрим объект cout. Этот объект создается таким образом, чтобы он обладал свойствами класса ostream. В определении класса ostream (еще одного обитателя файла iostream) описывается некоторый вид данных и операции, которые можно выполнять над этими данными, такие как вставка числа или строки в поток вывода. Конкретным представителем этого вида данных является объект класса ostream. Аналогично этому объект cin обладает свойствами класса istream, который также определен в файле iostream.

51 Несколько слов о классах Класс представляет собой описание всех свойств данных некоторого типа, а объект является сущностью, созданной в соответствии с этим описанием. Теперь читатель уже знает, что классы это определяемые пользователем типы данных, однако ему, как пользователю, разумеется, не пришлось разрабатывать классы ostream и istream. Подобно тому, как функции поставляются в виде библиотек функций, классы поставляются в виде библиотек классов. Именно так обстоит дело с классами ostream и istream. Технически они не являются частью языка C++, а представляют собой примеры классов, которые поставляются вместе с реализацией языка C++. Определения классов находятся в файле iostream, а не встроены в компилятор.

52 Несколько слов о классах В описании класса точно определены все операции, которые могут выполняться над его объектами. Чтобы произвести над некоторым объектом какое-либо допустимое действие, этому объекту необходимо передать сообщение. Например, чтобы объект cout отобразил на экране строку, ему посылается сообщение, которое фактически имеет следующий смысл: "Объект! Отобрази эту строку на экране!" В языке C++ имеются два способа передачи сообщений. Первый, который называется использованием метода класса, представляет собой, по существу, вызов функции с такими вызовами читатель уже знаком. Второй способ, применяемый при работе с объек­тами cin и cout, заключается в перегрузке операции. Таким образом, чтобы отправить объекту cout сообщение "отобразить на экране строку данных", в операторе сout « "I am not a crook." используется перегружения операция <<.

53 Функции Поскольку функции это модули, из которых строятся программы C++, и по­скольку они важны для определений элементов ООП в языке C++, необходимо изучить их самым тщательным образом. Некоторые аспекты этой темы довольно сложны, и в полном объеме функции будут рассматриваться дальше. Однако если вы познакомитесь с основными характеристиками функций сейчас, то впоследствии вам будет легче их изучать. Ниже в данной главе излагаются основные сведения о функциях. В языке C++ имеется две разновидности функций: функции с возвращаемыми значениями и без них. В стандартной библиотеке функций языка C++ присутствуют функции обоих видов. Кроме того, можно создавать свои собственные функции любого вида. Рассмотрим библиотечные функции, имеющие возвращаемое значение, а также научимся создавать собственные простые функции.

54 Применение функций с возвращаемым значением Функция, имеющая возвращаемое значение, в результате своей работы выдает значение, которое можно присвоить переменной. Например, в стандартную библиотеку C/C++ входит функция sqrt(), возвращающая квадратный корень числа. Предположим, что требуется вычислить квадратный корень числа 6,25 и присвоить полученное значение переменной х. Для этого в программе можно использовать такой оператор: Выражение sqrt(6.25) вызывает функцию sqrt(). Выражение sqrt(6.25) называется вызовом функции, сама функция называется вызываемой, а функция, в которой находится вызов функции, называется вызывающей (рис. 2.6).

55 Применение функций с возвращаемым значением

56 Применение функций с возвращаемым значением Значение в круглых скобках (в данном случае 6.25) представляет собой информацию, посылаемую функции; говорят, что эта информация передается в функцию. Значение, посылаемое в функцию таким образом, называется аргументом или параметром (рис. 2.7). Функция sqrt() вычисляет результат, который будет равен 2,5, и отправляет это значение обратно вызывающей функции. Это отправляемое значение называется возвращаемым значением функции. Можно считать, что возвращаемое значение замещает в операторе вызов функции после того, как функция завершит свою работу. Таким образом, в данном примере возвращаемое значение присваивается переменной х. Коротко говоря, аргумент это информация, посылаемая в функцию, а возвращаемое значение это значение, передаваемое обратно из функции.

57 Применение функций с возвращаемым значением

58 Применение функций с возвращаемым значением Необходимо лишь добавить, что, перед тем как использовать функцию, компилятор C++ должен знать типы аргументов и возвращаемого значения функции. Другими словами, что возвращает функция? Целое число? Символ? Число с дробной частью? Если у компилятора отсутствует эта информация, он не сможет интерпретировать возвращаемое значение. В языке C++ эта информация передается компилятору с помощью прототипа функции. Прототип функции является для функции тем же, чем для переменной является объявление переменной, он информирует программу о типах данных. Например, в библиотеке C++ определено, что функция sqrt() принимает в качестве аргумента число с необязательной дробной частью (например, 6,25) и возвращает число того же самого типа. В некоторых языках такие числа называются вещественными, но в языке C++ они называются данными типа double или числами с удвоенной точностью. Прототип функции sqrt () выглядит так: double sqrt(double); // прототип функции

59 Применение функций с возвращаемым значением Первое ключевое слово double означает, что функция sqrt() возвращает значение типа double. Ключевое слово double в круглых скобках означает, что функции sqrt() необходим аргумент типа double, т.е. этот прототип описывает функцию sqrt() точно так, как она используется в следующем выражении: double x; // объявление х как переменной типа double х = sqrt(б.25);

60 Применение функций с возвращаемым значением Заключительная точка с запятой идентифицирует прототип как оператор, сообщая таким образом компилятору, что это прототип, а не заголовок функции. Если опустить точку с запятой, то компилятор будет интерпретировать эту строку как заголовок функции и ожидать, что за ней последует тело функции, являющееся ее определением. Если в программе применяется функция sqrt(), необходимо включить в код ее прототип. Это можно обеспечить двумя способами: Вручную ввести прототип функции в исходный код программы. Включить в программу заголовочный файл cmath (в более ранних реализациях math.h), который содержит прототип этой функции.

61 Применение функций с возвращаемым значением Второй способ предпочтительней, так как он с большей вероятностью обеспечит правильность прототипа. Прототип любой функции из библиотеки C++ обязательно имеется в одном или нескольких заголовочных файлах. Для того чтобы узнать, какой заголовочный файл необходимо применить, следует просто посмотреть описание функции в руководстве к программе или в справочном файле, если он имеется. Например, из описания функции sqrt() можно узнать, что нужно использовать файл заголовков cmath. Не следует путать прототип функции с определением функции. Прототип, как можно было видеть, лишь описывает интерфейс функции, другими словами, он описывает информацию, посылаемую в функцию и из функции. А определение содержит код функции например, код вычисления квадратного корня числа.

62 Применение функций с возвращаемым значением В языках С и C++ прототипы и определения функций хранятся раздельно. Библиотечные файлы содержат скомпилированные коды функций, тогда как заголовочные файлы содержат прототипы функций. Прототип функции должен находиться в программе до того места, где функция применяется впервые. Обычно прототип функции помещается непосредственно перед определением функции main(). В листинге 2.4 демонстрируется применение библиотечной функции sqrt(); прототип функции помещается в прогамму путем включения файла cmath.

63 Применение функций с возвращаемым значением

64 Применение функций с возвращаемым значением How many square feet of sheets do you have? You can cover a square with sides of 11.1 feet with your sheets. Поскольку новые переменные можно объявлять в любом месте программы C++-, переменная side в программе sqrt.cpp объявляется непосредственно перед ее использованием. Кроме того, при объявлении переменной ей можно сразу же присваивать значение, поэтому можно было бы сделать так: double side = sqrt(cover); К этому действию, называемому инициализацией, мы вернемся. Обратите внимание, что объект cin способен преобразовывать информацию входного потока в данные типа double, а объект cout может вставлять данные типа double в выходной поток.

65 Разновидности функций Некоторым функциям требуется более одного элемента информации. Эти функции используют несколько аргументов, разделяемых запятыми. Например, математическая функция pow() принимает два аргумента и возвращает значение, равное первому аргументу, возведенному в степень, определяемую вторым аргументом. Она имеет такой прототип: double pow(double, double); //прототип функции с двумя аргументами Если, скажем, вам требуется вычислить 5 в 8-й степени, то следует использовать та­кой оператор: answer = pow(5.О, 8.0); // вызов функции со списком аргументов

66 Разновидности функций Имеются функции, которые не принимают аргументов. Например, одна из библиотек С (связанная с заголовочным файлом cstdlib или stdlib.h) содержит функцию rand(), которая не имеет аргументов; данная функция возвращает случайное целое число. Ее прототип выглядит следующим образом: int rand(void); // прототип функции, не принимающей аргументов Ключевое слово void явно указывает на то, что функция не принимает аргументов.

67 Разновидности функций В отличие от некоторых языков программирования, в C++ скобки при вызове функции должны присутствовать даже тогда, когда аргументов нет. Имеются также функции, у которых отсутствует возвращаемое значение. Это задается в прототипе функции с помощью ключевого слова void, которое должно указываться на месте типа возвращаемого значения: void bucks(double); // прототип функции, не имеющей // возвращаемого значения Поскольку эта функция не имеет возвращаемого значения, ее нельзя применять в операторе присваивания или в каком-нибудь другом выражении. Вместо этого можно использовать оператор простого вызова функции: bucks ( )// вызов функции, возвращаемое // значение отсутствует

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

69 Функции, определяемые пользователем Теперь предположим, что в программу необходимо добавить еще одну, определяемую пользователем функцию. Как и в случае с библиотечными функциями, для вызова определяемой пользователем функции в программе используется ее имя. И так же, как для библиотечных функций, в программе следует поместить прототип функции до ее вызова; обычно прототип помещается непосредственно перед определением функции main(). Новым здесь является то, что в программе необходимо привести также и исходный код определяемой функции. Самый простой способ поместить этот код после кода функции main() в том же файле. Этот способ иллюстрируется в листинге 2.5.

70 Функции, определяемые пользователем

71 Функции, определяемые пользователем Функция main () вызывает функцию simon () дважды. Первый раз аргументом является число 3, а второй раз переменная count. Между этими вызовами пользователь вводит целое число, которое сохраняется в переменной count. В сообщении-подсказке, выводимом на экран объектом cout, не используется символ новой строки. В результате данные, вводимые пользователем, оказываются в той же строке, что и сообщение-подсказка. Ниже приведен пример выходных данных программы: Simon says touch your toes 3 times. Pick an integer: 512 Simon says touch your toes 512 times.

72 Формат определения функции Определение функции simon () имеет тот же самый формат, что и определение функции main (). Сначала идет заголовок функции, затем следует тело функции, заключенное в фигурные скобки. В общем случае формат определения функции следующий: тип имя__функции (список__аргументов) { операторы } Обратите внимание на то, что определение функции simon () следует сразу же за закрывающей скобкой функции main(). В отличие от языка Pascal и подобно языку С, в языке C++ одно определение функции нельзя вкладывать в другое. Каждое определение функции располагается отдельно от всех остальных; все функции являются равнозначными (рис. 2.8).

73 Формат определения функции

74 Заголовки функций Заголовок функции simon () имеет следующий вид: void simon (int n) Начальное ключевое слово void означает, что функция simon () не имеет возвращаемого значения. Следовательно, в результате вызова функции simon () не будет получено число, которое можно было бы присвоить какой-нибудь переменной в функции main (). Итак, первый вызов этой функции выглядит следующим образом: simon(3); // правильно для функций // без возвращаемого значения

75 Заголовки функций Поскольку у функции simon () отсутствует возвращаемое значение, ее нельзя использовать таким образом: simple = simon(3); Выражение int n в круглых скобках означает, что функция simon () имеет один аргумент типа int. Здесь п это новая переменная, которой присваивается значение, передаваемое в функцию во время ее вызова. Таким образом, при вызове следующей функции simon(3); переменной п, определенной в заголовке этой функции, присваивается значение 3. Переменная п в операторе cout означает, что используется ее значение, передаваемое в функцию при вызове. Вот почему в выходных данных функции simon(3) отображается число 3. В примере выходных данных при втором вызове функции simon (count) отображается число 512, поскольку это значение было присвоено переменной count. Иными словами, заголовок функции simon() информирует программу о том, что эта функция принимает один аргумент типа int и у нее отсутствует возвращаемое значение.

76 Заголовки функций Рассмотрим заголовок функции main(): int main () Ключевое слово int означает, что функция main () возвращает целочисленное значение. Пустые круглые скобки (в которых может стоять слово void это одно и то же) означают, что функция main() не имеет аргументов. В функции с возвращаемым значением должен присутствовать оператор return, чтобы завершить выполнение функции и переслать возвращаемое значение в вызывающую функцию. Вот почему в конце функции main () содержится следующий оператор: return 0;

77 Заголовки функций Логически это правильно: функция main() должна возвращать значение типа int, и данный оператор возвращает целое число 0. Но здесь возникает закономерный вопрос: куда возвращается это значение? Ведь в программе нет вызова функции main(), как в приведенном ниже примере: squeeze = main(); // в наших программах отсутствует Нетрудно догадаться, что поскольку программу вызывает операционная система (скажем, UNIX или DOS), то, следовательно, функция main() возвращает значение не в другую часть этой же программы, а в операционную систему.

78 Определяемая пользователем функция с возвращаемым значением Теперь напишем функцию, в которой используется оператор return (оператор возврата). Как это сделать, иллюстрирует функция main (): в заголовке функции необходимо указать тип возвращаемого значения, а в конце тела функции поставить оператор return. С помощью такой функции можно решить проблему взвешивания для тех, кто посещает Великобританию. Там многие напольные весы имеют шкалу, откалиброванную в стоунах, а не в фунтах США или килограммах. Один стоун равен 14 фунтам, и программа из листинга 2.6 содержит функцию, которая осуществляет преобразование из стоунов в фунты

79 Определяемая пользователем функция с возвращаемым значением

80 Определяемая пользователем функция с возвращаемым значением В результате выполнения программы мы получим следующие результаты: Enter the weight in stone: stone are 196 pounds. С помощью объекта cin функция main() вводит значение для целочисленной переменной stone. Это значение передается функции stonetolb () в качестве аргумента. Функция stonetolb () присваивает данное значение переменной sts и, используя ключевое слово return, возвращает в функцию main() значение 14 * sts. Такая запись оператора return иллюстрирует тот факт, что за ключевым словом return вовсе не обязательно должно следовать простое число. Используя в данном операторе сложное выражение, мы избегаем необходимости создавать новую переменную и присваивать ей возвращаемое значение перед передачей вызывающей функции. Программа вычисляет значение этого выражения (в данном примере 196) и возвращает результирующее значение.

81 Определяемая пользователем функция с возвращаемым значением В общем случае использование функции с возвращаемым значением допускается везде, где можно применять простую константу того же самого типа. Например, функция stonetolb возвращает значение типа int. Это означает, что функцию можно использовать следующими способами: int aunt = stonetolb(20) ; int aunts = aunt + stonetolb(10); cout « "Ferdie weighs " « stonetolb(16) « " pounds.\n"; В любом случае программа вычисляет возвращаемое значение и затем использует его в операторе.

82 Определяемая пользователем функция с возвращаемым значением Как видно из этих примеров, прототип функции описывает интерфейс функции, т.е. ее взаимодействие с остальной частью программы. Список аргументов указывает вид информации, передаваемой в функцию, а тип функции тип возвращаемого ею значения. Хотя функция stonetolb() является короткой и простой, в ней реализованы все функциональные особенности, присущие функциям: Присутствуют заголовок и тело функции. Она принимает аргумент. Функция возвращает значение. Для нее требуется наличие прототипа.

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