zaeto.ru

В систематизированном виде излагаются основные понятия и описываются возможности языка C++. При этом основное внимание уделяется объяснению того, как теми или иными возможностями пользоваться

Другое
Экономика
Финансы
Маркетинг
Астрономия
География
Туризм
Биология
История
Информатика
Культура
Математика
Физика
Философия
Химия
Банк
Право
Военное дело
Бухгалтерия
Журналистика
Спорт
Психология
Литература
Музыка
Медицина
добавить свой файл
 

 
страница 1 страница 2 ... страница 6 страница 7


Борю С.Ю.

Язык программирования C++

(языки объектно орентированного программирования)



Информация о курсе

В систематизированном виде излагаются основные понятия и описываются возможности языка C++. При этом основное внимание уделяется объяснению того, как теми или иными возможностями пользоваться.

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

Лекции: описание

1. Начальные сведения о языке

История создания языка и его эволюция. Международный стандарт языка. Сферы применения языка Си++. Пример простой программы. Объясняется процесс ее написания, использования простейших конструкций языка, использования транслятора и запуск программы на выполнение.



2. Имена, переменные и константы

Правила именования переменных и функций языка, правила записи констант. Понятие ключевого или зарезервированного слова, список ключевых слов Си++.



3. Операции и выражения

Правила формирования и вычисления выражений в языке Си++. Все операции языка.





4. Операторы

Описываются все операторы управления, имеющиеся в языке Си++, даются примеры их использования.





5. Функции

Функции – это основные единицы построения программ при процедурном программировании на языке Си++. Правила их записи, вызова и передачи параметров.





6. Встроенные типы данных

Рассматриваются все встроенные типы языка Си++: целые числа разной разрядности, вещественные числа, логические величины, перечисляемые значения, символы и их кодировка.





7. Классы и объекты

Способы описания классов. Создание объектов. Обращение к атрибутам и методам объектов.





8. Производные типы данных

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





9. Распределение памяти

Проблемы при явном распределении памяти в Си++, способы их решения. Ссылки и указатели. Распределение памяти под переменные, управление памятью с помощью переопределения операторов new и delete.





10. Производные классы, наследование

Наследование, виды наследования. Виртуальные методы. Абстрактные классы. Множественное наследование.





11. Контроль доступа к объекту

Рассматривается возможности контроля доступа к атрибутам и методам объекта, контроль по чтению и по записи.





12. Классы – конструкторы и деструкторы

Конструкторы и деструкторы классов. Возможности инициализации объектов. Копирующий конструктор. Операции new и delete.





13. Дополнительные возможности классов

Рассматриваются дополнительные возможности при определении классов, включая переопределение операций, определение методов inline и задание собственных преобразований типа.





14. Компоновка программ, препроцессор

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





15. Определение, время жизни и области видимости переменных в больших программах

Возможности построения больших программ, использование общих данных. Определение контекста, оператор namespace.





16. Обработка ошибок

Попытка классификации ошибок. Сообщение об ошибке с помощью возвращаемого значения. Исключительные ситуации. Обработка исключительных ситуаций, операторы try и catch.





17. Bвод-вывод

Потоки. Манипуляторы и форматирование ввода-вывода. Строковые потоки. Ввод-вывод файлов.





18. Шаблоны

Понятие шаблона. Функции-шаблоны. Шаблоны классов. Примеры использования.





Литература




  1. Фридман А.Л.
    Язык программирования Си++
    Интернет-университет информационных технологий - ИНТУИТ.ру, 2004

  2. Фридман А.Л.
    Основы объектно-ориентированного программирования на языке Си++. Учебный курс
    Радио и связь, 1999

  3. Бьерн Страуструп
    Язык программирования C++, 3 издание
    Невский Диалект, 1999

  4. Мейерс С.
    Эффективное использование C ++. 50 рекомендаций по улучшению ваших программ и проектов
    ДМК, 2000

  5. Шилдт Герберт. Самоучитель С++ (2-ред)./Пер. с англ.-СПб.: BHV-Санкт-Петербург, 1997.-512с. (+дискета с примерами)

  6. Бруно Бабэ. Просто и ясно о Borland C++: Версии 4.0 и 4.5/ Пер. с англ. -М.:БИНОМ, 1994. - 400с.

  7. Клочков Д.П., Павлов Д.А. Введение в объектно-ориентированное программирование. / Учебно-методическое пособие. - Изд. Нижегор. ун-та, 1995. - 70с.

  8. Элиас М., Страуструп Б. Справочное руководство по языку С++ с комментариями. /Пер. с англ. -М.:Мир, 1992.- с.

Оглавление

1 Начальные сведения о языке 6

1.1 История и назначение языка Си++ 6

1.2 Простейшая программа на языке Си++ 6

1.3 Компиляция и выполнение программы 7

1.4 Компилирование и выполнение программ в среде Windows 7

1.5 Компилирование и выполнение программ в среде Unix 8

2 Имена, переменные и константы 9

2.1 Имена 9

2.2 Переменные 9

2.3 Константы 10

3 Операции и выражения 11

3.1 Выражения 11

3.2 Операция присваивания 11

3.3 Все операции языка Си++ 12

3.4 Арифметические операции 12

3.5 Операции сравнения 13

3.6 Логические операции 13

3.7 Битовые операции 13

3.8 Условная операция 14

3.9 Последовательность 14

3.10 Операции присваивания 14

3.11 Порядок вычисления выражений 14

4 Операторы 16

4.1 Что такое оператор 16

4.2 Операторы-выражения 16

4.3 Объявления имен 16

4.4 Операторы управления 16

4.5 Условные операторы 16

4.6 Операторы цикла 18

4.7 Оператор возврата 20

4.8 Оператор перехода 20

Функции 22

5.1 Вызов функций 22

5.2 Имена функций 23

5.3 Необязательные аргументы функций 23

5.4 Рекурсия 24

6 Встроенные типы данных 26

6.1 Общая информация 26

6.2 Целые числа 26

6.3 Вещественные числа 28

6.4 Логические величины 29

6.3 Символы и байты 29

6.4 Кодировка, многобайтовые символы 30

6.5 Наборы перечисляемых значений 31

7 Классы и объекты 32

7.1 Понятие класса 32

7.2 Определение методов класса 32

7.4 Переопределение операций 33

7.5 Подписи методов и необязательные аргументы 34

7.6 Запись классов 34

8 Производные типы данных 36

8.1 Массивы 36

8.2 Структуры 37

8.3 Битовые поля 37

8.4 Объединения 38

8.5 Указатели 39

8.6 Адресная арифметика 41

8.7 Связь между массивами и указателями 42

8.8 Бестиповый указатель 43

8.9 Нулевой указатель 43

8.10 Строки и литералы 44

9 Распределение памяти 47

9.1 Автоматические переменные 47

9.2 Статические переменные 47

9.3 Динамическое выделение памяти 48

9.4 Выделение памяти под строки 48

9.5 Рекомендации по использованию указателей и динамического распределения памяти 49

9.6 Ссылки 49

9.7 Распределение памяти при передаче аргументов функции 50

9.8 Рекомендации по передаче аргументов 52

10 Производные классы, наследование 54

10.1 Наследование 54

10.2 Виртуальные методы 57

10.3 Виртуальные методы и переопределение методов 59

10.4 Преобразование базового и производного классов 60

10.5 Внутреннее и защищенное наследование 60

10.6 Абстрактные классы 61

10.7 Множественное наследование 62

10.8 Виртуальное наследование 64

11 Контроль доступа к объекту 66

11.1 Интерфейс и состояние объекта 66

11.2 Объявление friend 67

11.3 Использование описателя const 68

11.4 Доступ к объекту по чтению и записи 68

12 Классы – конструкторы и деструкторы 70

12.1 Копирующий конструктор 71

12.2 Деструкторы 73

12.3 Инициализация объектов 74

12.4 Операции new и delete 77

13 Дополнительные возможности классов 80

13.1 Переопределение операций 80

13.2 Как определять операции 81

13.3 Преобразования типов 82

13.4 Явные преобразования типов 82

13.5 Стандартные преобразования типов 83

13.6 Преобразования указателей и ссылок 84

13.7 Преобразования типов, определенных в программе 84

14 Компоновка программ, препроцессор 86

14.1 Компоновка нескольких файлов в одну программу 86

14.2 Проблема использования общих функций и имен 86

14.3 Использование включаемых файлов 88

14.4 Препроцессор 90

14.5 Определение макросов 90

14.6 Условная компиляция 91

14.7 Дополнительные директивы препроцессора 91

15 Определение, время жизни и области видимости переменных в больших программах 92

15.1 Файлы и переменные 92

15.2 Общие данные 92

15.3 Глобальные переменные 94

15.4 Повышение надежности обращения к общим данным 95

15.5 Область видимости имен 97

15.6 Оператор определения контекста namespace 98

16 Обработка ошибок 100

16.1 Виды ошибок 100

16.2 Возвращаемое значение как признак ошибки 100

16.3 Исключительные ситуации 102

16.4 Обработка исключительных ситуаций 103

16.5 Примеры обработки исключительных ситуаций 104

17 Bвод-вывод 108

17.1 Потоки 108

17.2 Операции << и >> для потоков 108

17.3 Манипуляторы и форматирование ввода-вывода 109

17.4 Строковые потоки 110

17.5 Ввод-вывод файлов 111

18 Шаблоны 114

18.1 Назначение шаблонов 114

18.2 Функции-шаблоны 114

18.3 Шаблоны классов 115

18.4 "Интеллигентный указатель" 116

18.5 Задание свойств класса 119

Литература 122


1 Начальные сведения о языке

1.1 История и назначение языка Си++

Разработчиком языка Си++ является Бьерн Страуструп. В своей работе он опирался на опыт создателей языков Симула, Модула 2, абстрактных типов данных. Основные работы велись в исследовательском центре компании Bell Labs.

Непосредственный предшественник Си++ – язык Си с классами – появился в 1979 году, а в 1997 году был принят международный стандарт Си++, который фактически подвел итоги его 20-летнего развития. Принятие стандарта обеспечило единообразие всех реализаций языка Си++. Не менее важным результатом стандартизации стало то, что в процессе выработки и утверждения стандарта язык был уточнен и дополнен рядом существенных возможностей.

На сегодня стандарт утвержден Международной организацией по стандартзации ISO. Его номер ISO/IEC 14882. ISO бесплатно стандарты не распространяет. Его можно получить на узле американского национального комитета по стандартам в информационных технологиях: www.ncits.org В России следует обращаться в ВНИИ Сертификации: http://www.vniis.ru

Проекты стандарта имеются в свободном доступе: ftp://ftp.research.att.com/dist/c++std/WP/CD2/ http://www/research.att.com/~bs/bs_faq.html

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

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

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

Распределенные системы, функционирующие на разных компьютерах, также разрабатываются на языке Си++. Этому способствует то, что у широко распространенных компонентых моделей CORBA и COM есть удобные интерфейсы на языке Си++.

Обработка сложных структур данных – текста, бизнес-информации, Internet-страниц и т.п. – одна из наиболее распространенных возможностей применения языка. В прикладном программировании, наверное, проще назвать те области, где язык Си++ применяется мало.

Разработка графического пользовательского интерфейса на языке Си++ выполняется, в основном, тогда, когда необходимо разрабатывать сложные, нестандартные интерфейсы. Простые программы чаще пишутся на языках Visual Basic, Java и т.п.

Программирование для Internet в основном производится на языках Java, VBScript, Perl.

В целом надо сказать, что язык Си++ в настоящее время является одним из наиболее распространенных языков программирования в мире.

1.2 Простейшая программа на языке Си++

Самая короткая программа на языке Си++ выглядит так:

// Простейшая программа

int main() { return 1; }

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

main – это имя главной функции программы. С функции main всегда начинается выполнение. У функции есть имя (main), после имени в круглых скобках перечисляются аргументы или параметры функции (в данном случае у функции main аргументов нет). У функции может быть результат или возвращаемое значение. Если функция не возвращает никакого значения, то это обозначается ключевым словом void. В фигурных скобках записывается тело функции – действия, которые она выполняет. Оператор return 1 означает, что функция возвращает результат – целое число 1.

Если мы говорим об объектно-ориентированной программе, то она должна создать объект какого-либо класса и послать ему сообщение. Чтобы не усложнять программу, мы воспользуемся одним из готовых, предопределенных классов – классом ostream (поток ввода-вывода). Этот класс определен в файле заголовков "iostream.h". Поэтому первое, что надо сделать – включить файл заголовков в нашу программу:

#include

int main() { return 1; }

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



#include

int main()

{

cout << "Hello world!" << endl;

return 1;

}

Операция сдвига << для класса ostream определена как "вывести". Таким образом, программа посылает объекту cout сообщения "вывести строку Hello world!" и "вывести перевод строки" (endl обозначает новую строку). В ответ на эти сообщения объект cout выведет строку "Hello world!" на консоль и переведет курсор на следующую строку.

1.3 Компиляция и выполнение программы

Программа на языке Си++ – это текст. С помощью произвольного текстового редактора программист записывает инструкцию, в соответствии с которой компьютер будет работать, выполняя данную программу.

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

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

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

1.4 Компилирование и выполнение программ в среде Windows

Если Вы используете персональный компьютер с операционной системой Microsoft© Windows 98™, Windows NT™ или Windows 2000™, то компилятор у Вас, скорее всего, Visual C++©. Этот компилятор представляет собой интегрированную среду программирования, т.е. объединяет текстовый редактор, компилятор, отладчик и еще ряд дополнительных программ. Мы предполагаем, что читатель работает с версией 5.0 или старше. Версии младше 4.2 изучать не имеет смысла, поскольку реализация слишком сильно отличается от стандарта языка.

В среде Visual C++ прежде всего необходимо создать новый проект. Для этого нужно выбрать в меню File атрибут New. Появится новое диалоговое окно. В закладке Projects в списке различных типов выполняемых файлов выберите Win32 Consol Application. Убедитесь, что отмечена кнопка Create new workspace. Затем следует набрать имя проекта (например, test ) в поле Project name и имя каталога, в котором будут храниться все файлы, относящиеся к данному проекту, в поле Location. После этого нажмите кнопку "OK".

Теперь необходимо создать файл. Опять в меню File выберите атрибут New. В появившемся диалоге в закладке File отметьте text file. По умолчанию новый файл будет добавлен к текущему проекту test , в чем можно убедиться, взглянув на поле Add to project. В поле Filename нужно ввести имя файла. Пусть это будет main.cpp. Расширение .cpp – это стандарт для файлов с исходными текстами на языке Си++. Поле Location должно показывать на каталог C:\Work. Нажмите кнопку "OK".

На экране появится пустой файл. Наберите текст программы.

Компиляция выполняется с помощью меню Build. Выберите пункт Build test.exe (этому пункту меню соответствует функциональная клавиша F7). В нижней части экрана появятся сообщения компиляции. Если Вы сделали опечатку, двойной щелчок мышью по строке с ошибкой переведет курсор в окне текстового редактора на соответствующую строку кода. После исправления всех ошибок и повторной компиляции система выдаст сообщение об успешной компиляции и компоновке (пока мы не будем уточнять, просто вы увидите сообщение Linking).

Готовую программу можно выполнить с помощью меню Build, пункт Execute test.exe. То же самое можно сделать, нажав одновременно клавиши CTRL и F5. На экране монитора появится консольное окно, и в нем будет выведена строка "Hello world!". Затем появится надпись "Press any key to continue". Эта надпись означает, что программа выполнена и лишь ожидает нажатия произвольной клавиши, чтобы закрыть консольное окно.

1.5 Компилирование и выполнение программ в среде Unix

Если Вы работаете в операционной системе Unix , то, скорее всего, у Вас нет интегрированной среды разработки программ. Вы будете пользоваться любым доступным текстовым редактором для того, чтобы набирать тексты программ.

Редактор Emacs предпочтительнее, поскольку в нем есть специальный режим редактирования программ на языке Си++. Этот режим включается автоматически при редактировании файла с именем, оканчивающимся на ".cpp" или ".h". Но при отсутствии Emacs сгодится любой текстовый редактор.

Первое, что надо сделать – это поместить текст программы в файл. В редакторе следует создать файл с именем main.cpp (расширение cpp используется для текстов программ на языке Си++). Наберите текст программы из предыдущего параграфа и сохраните файл.

Теперь программу надо откомпилировать. Команда вызова компилятора зависит от того, какой компилятор Си++ установлен на компьютере. Если используется компилятор GNU C++, команда компиляции выглядит так:

gcc main.cpp

Вместо gcc может использоваться g++, c++, cc. Уточнить это можно у системного администратора. Отметим, что у широко распространенного компилятора GNU C++ есть ряд отличий от стандарта ISO.

В случае каких-либо ошибок в программе компилятор выдаст на терминал сообщение с указанием номера строки, где обнаружена ошибка. Если в программе нет никаких опечаток, компилятор должен создать исполняемый файл с именем a.out. Выполнить его можно, просто набрав имя a.out в ответ на подсказку интерпретатора команд:

a.out

Результатом выполнения будет вывод на экран терминала строки:



Hello world!

2 Имена, переменные и константы



2.1 Имена

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

Идентификаторы в языке Си++ – это последовательность знаков, начинающаяся с буквы. В идентификаторах можно использовать заглавные и строчные латинские буквы, цифры и знак подчеркивания. Длина идентификаторов произвольная. Примеры правильных идентификаторов:



abc A12 NameOfPerson BITES_PER_WORD

Отметим, что abc и Abc – два разных идентификатора, т.е. заглавные и строчные буквы различаются. Примеры неправильных идентификаторов:



12X a-b

Ряд слов в языке Си++ имеет особое значение и не может использоваться в качестве идентификаторов. Такие зарезервированные слова называются ключевыми.

Список ключевых слов:

asm auto bad_cast

bad_typeid bool break

case catch char

class const const_cast

continue default delete

do double dynamic_cast

else enum extern

float for friend

goto if inline

int long namespace

new operator private

protected public register

reinterpret_cast return short

signed sizeof static

static_cast struct switch

template then this

throw try type_info

typedef typeid union

unsigned using virtual

void volatile while

xalloc

В следующем примере



int max(int x, int y)

{

if (x > y)

return x;

else

return y;

}

max, x и y – имена или идентификаторы. Слова int, if, return и else – ключевые слова, они не могут быть именами переменных или функций и используются для других целей.

2.2 Переменные

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

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

В языке Си++ прежде чем использовать переменную, ее необходимо объявить. Объявить переменную с именем   x можно так:

int x;


В объявлении первым стоит название типа переменной   int (целое число), а затем идентификатор   x – имя переменной. У переменной   x есть тип – в данном случае целое число. Тип переменной определяет, какие возможные значения эта переменная может принимать и какие операции можно выполнять над данной переменной. Тип переменной изменить нельзя, т.е. пока переменная   x существует, она всегда будет целого типа.

Язык Си++ – это строго типизированный язык. Любая величина, используемая в программе, принадлежит к какому-либо типу. При любом использовании переменных в программе проверяется, применимо ли выражение или операция к типу переменной. Довольно часто смысл выражения зависит от типа участвующих в нем переменных.

Например, если мы запишем x+y, где x – объявленная выше переменная, то переменная y должна быть одного из числовых типов.

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

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

int x; // объявить целую переменную x

int y; // объявить целую переменную y

x = 0; // присвоить x значение 0

y = x + 1; // присвоить y значение x + 1,

// т.е. 1

x = 1; // присвоить x значение 1

y = x + 1; // присвоить y значение x + 1,

// теперь уже 2

2.3 Константы

В программе можно явно записать величину – число, символ и т.п. Например, мы можем записать выражение x + 4 – сложить текущее значение переменной   x и число 4. В зависимости от того, при каких условиях мы будем выполнять программу, значение переменной   x может быть различным. Однако целое число четыре всегда останется прежним. Это неизменяемая величина или константа.

Таким образом, явная запись значения в программе – это константа.

Далеко не всегда удобно записывать константы в тексте программы явно. Гораздо чаще используются символические константы. Например, если мы запишем

const int BITS_IN_WORD = 32;

то затем имя   BITS_IN_WORD можно будет использовать вместо целого числа 32.

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



b / BITS_IN_WORD

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


3 Операции и выражения

3.1 Выражения

Программа оперирует с данными. Числа можно складывать, вычитать, умножать, делить. Знаки можно сравнивать и т.д. То есть из разных величин можно составлять выражения, результат вычисления которых – новая величина. Приведем примеры выражений:

X * 12 + Y // значение X умножить на 12 и к

// результату прибавить значение Y

val < 3 // сравнить значение val с 3

-9 // константное выражение -9

Выражение, после которого стоит точка с запятой – это оператор-выражение. Его смысл состоит в том, что компьютер должен выполнить все действия, записанные в данном выражении, иначе говоря, вычислить выражение.



x + y – 12; // сложить значения x и y и затем

// вычесть 12

a = b + 1; // прибавить единицу к значению b и

// запомнить результат в переменной a

Выражения – это переменные, функции и константы, называемые операндами, объединенные знаками операций. Операции могут быть унарными – с одним операндом, например, минус; могут быть бинарные – с двумя операндами, например сложение или деление. В Си++ есть даже одна операция с тремя операндами – условное выражение. Чуть позже мы приведем список всех операций языка Си++ для встроенных типов данных. Подробно каждая операция будет разбираться при описании соответствующего типа данных. Кроме того, ряд операций будет рассмотрен в разделе, посвященном определению операторов для классов. Пока что мы ограничимся лишь общим описанием способов записи выражений.

В типизированном языке, которым является Си++, у переменных и констант есть определенный тип. Есть он и у результата выражения. Например, операции сложения (+), умножения (*), вычитания (-) и деления (/), примененные к целым числам, выполняются по общепринятым математическим правилам и дают в результате целое значение. Те же операции можно применить к вещественным числам и получить вещественное значение.

Операции сравнения: больше (>), меньше (<), равно (==), не равно (!=) сравнивают значения чисел и выдают логическое значение: истина (true) или ложь (false).

3.2 Операция присваивания

Присваивание – это тоже операция, она является частью выражения. Значение правого операнда присваивается левому операнду.



x = 2; // переменной x присвоить значе-

cond = x < 2; // ние 2, переменной cond

// присвоить значение true,

// если x меньше 2, в противном

// случае присвоить значение

3 = 5; // false ошибка, число 3

// неспособно изменять свое

// значение

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



int x = 0;

x = 3;

x = 4;

x = x + 1;

вначале объявляется переменная x с начальным значением 0. После этого значение x изменяется на 3, 4 и затем 5. Опять-таки, обратим внимание на последнюю строчку. При вычислении операции присваивания сначала вычисляется левый операнд, а затем правый. Когда вычисляется выражение x + 1, значение переменной x равно 4. Поэтому значение выражения x + 1 равно 5. После вычисления операции присваивания (или, проще говоря, после присваивания) значение переменной x становится равным 5.

У операции присваивания тоже есть результат. Он равен значению левого операнда. Таким образом, операция присваивания может участвовать в более сложном выражении:

z = (x = y + 3);

В приведенном примере переменным x и z присваивается значение y + 3.

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

int x = 0;

++x;

Значение x увеличивается на единицу и становится равным 1.



--x;

Значение x уменьшается на единицу и становится равным 0.



int y = ++x;

Значение x опять увеличивается на единицу. Результат операции ++ – новое значение x, т.е. переменной y присваивается значение 1.



int z = x++;

Здесь используется постфиксная запись операции увеличения на единицу. Значение переменной x до выполнения операции равно 1. Сама операция та же – значение x увеличивается на единицу и становится равным 2. Однако результат постфиксной операции – значение аргумента до увеличения. Таким образом, переменной z присваивается значение 1. Аналогично, результатом постфиксной операции уменьшения на единицу является начальное значение операнда, а префиксной – его конечное значение.

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

x = x + 5;

y = y * 3;

z = z – (x + y);

В Си++ эти выражения можно записать короче:



x += 5;

y *= 3;

z -= x + y;

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

3.3 Все операции языка Си++

Наряду с общепринятыми арифметическими и логическими операциями, в языке Си++ имеется набор операций для работы с битами – поразрядные И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ и НЕ, а также сдвиги.

Особняком стоит операция sizeof. Эта операция позволяет определить, сколько памяти занимает то или иное значение. Например:

sizeof(long);

// сколько байтов занимает тип long

sizeof b;

// сколько байтов занимает переменная b

Операция sizeof в качестве аргумента берет имя типа или выражение. Аргумент заключается в скобки (если аргумент – выражение, скобки не обязательны). Результат операции – целое число, равное количеству байтов, которое необходимо для хранения в памяти заданной величины.

Ниже приводятся все операции языка Си++.

3.4 Арифметические операции



+ сложение

- вычитание

* умножение

/ деление

Операции сложения, вычитания, умножения и деления целых и вещественных чисел. Результат операции – число, по типу соответствующее большему по разрядности операнду. Например, сложение чисел типа short и long в результате дает число типа long.



% остаток

Операция нахождения остатка от деления одного целого числа на другое. Тип результата – целое число.



- минус

+ плюс

Операция "минус" – это унарная операция, при которой знак числа изменяется на противоположный. Она применима к любым числам со знаком. Операция "плюс" существует для симметрии. Она ничего не делает, т.е. примененная к целому числу, его же и выдает.



++ увеличить на единицу, префиксная и

постфиксная формы

-- уменьшить на единицу, префиксная и

постфиксная формы

Эти операции иногда называют "автоувеличением" и "автоуменьшением". Они увеличивают (или, соответственно, уменьшают) операнд на единицу. Разница между постфиксной (знак операции записывается после операнда, например x++) и префиксной (знак операции записывается перед операндом, например --y) операциями заключается в том, что в первом случае результатом является значение операнда до изменения на единицу, а во втором случае – после изменения на единицу.

3.5 Операции сравнения

== равно

!= не равно

< меньше

> больше

<= меньше или равно

>= больше или равно

Операции сравнения. Сравнивать можно операнды любого типа, но либо они должны быть оба одного и того же встроенного типа (сравнение на равенство и неравенство работает для двух величин любого типа), либо между ними должна быть определена соответствующая операция сравнения. Результат – логическое значение true или false.

3.6 Логические операции

&& логическое И

|| логическое ИЛИ

! логическое НЕ

Логические операции конъюнкции, дизъюнкции и отрицания. В качестве операндов выступают логические значения, результат – тоже логическое значение true или false.

3.7 Битовые операции

& битовое И

| битовое ИЛИ

^ битовое ИСКЛЮЧАЮЩЕЕ ИЛИ

~ битовое НЕ

Побитовые операции над целыми числами. Соответствующая операция выполняется над каждым битом операндов. Результатом является целое число.



<< сдвиг влево

>> сдвиг вправо

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

3.8 Условная операция

? : условное выражение

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

3.9 Последовательность

, последовательность

Выполнить выражение до запятой, затем выражение после запятой. Два произвольных выражения можно поставить рядом, разделив их запятой. Они будут выполняться последовательно, и результатом всего выражения будет результат последнего выражения.

3.10 Операции присваивания

= присваивание

Присвоить значение правого операнда левому. Результат операции присваивания – это значение правого операнда.



+=, -=, *=, /=, %=, |=, &=, ^=, <<=, >>=

выполнить операцию и присвоить

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

3.11 Порядок вычисления выражений

У каждой операции имеется приоритет. Если в выражении несколько операций, то первой будет выполнена операция с более высоким приоритетом. Если же операции одного и того же приоритета, они выполняются слева направо.

Например, в выражении

2 + 3 * 6

сначала будет выполнено умножение, а затем сложение;соответственно, значение этого выражения — число 20.

В выражении

2 * 3 + 4 * 5

сначала будет выполнено умножение, а затем сложение. В каком порядке будет производиться умножение – сначала 2 * 3, а затем 4 * 5 или наоборот, не определено. Т.е. для операции сложения порядок вычисления ее операндов не задан.

В выражении

x = y + 3

вначале выполняется сложение, а затем присваивание, поскольку приоритет    операции присваивания ниже, чем приоритет операции сложения.

Для данного правила существует исключение: если в выражении несколько операций присваивания, то они выполняются справа налево. Например, в выражении

x = y = 2

сначала будет выполнена операция присваивания значения 2 переменной y. Затем результат этой операции – значение 2 – присваивается переменной x.

Ниже приведен список всех операций в порядке понижения приоритета. Операции с одинаковым приоритетом выполняются слева направо (за исключением нескольких операций присваивания).

:: (разрешение области видимости имен)

. (обращение к элементу класса),

-> (обращение к элементу класса по указателю),

[] (индексирование), вызов функции,

++ (постфиксное увеличение на единицу),

-- (постфиксное уменьшение на единицу),

typeid (нахождение типа),

dynamic_cast static_cast reinterpret_cast const_cast (преобразования типа)

sizeof (определение размера),

++ (префиксное увеличение на единицу),

-- (префиксное уменьшение на единицу),

~ (битовое НЕ),

! (логическое НЕ),

(изменение знака),



+ (плюс),

& (взятие адреса),

* (обращение по адресу),

new (создание объекта),

delete (удаление объекта),

(type) (преобразование типа)

.* ->* (обращение по указателю на элемент класса)

* (умножение),

/ (деление),

% (остаток)

+ (сложение),

(вычитание)



<< , >> (сдвиг)

< <= > >= (сравнения на больше или меньше)

== != (равно, неравно)

& (поразрядное И)

^ (поразрадное исключающее ИЛИ)

| (поразрядное ИЛИ)

&& (логическое И)

|| (логическое ИЛИ)

= (присваивание),

*= /= %= += -= <<= >>= &= |= ^= (выполнить операцию и присвоить)

?: (условная операция)

throw

, (последовательность)

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



(2 + 3) * 6

будет 30.

Скобки могут быть вложенными, соответственно, самые внутренние выполняются первыми:

(2 + (3 * (4 + 5) ) – 2)

4 Операторы

4.1 Что такое оператор

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

Различают операторы объявления имен, операторы управления и операторы-выражения.

4.2 Операторы-выражения

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

a = 1;

b = 3;

m = max(a, b);

Переменной a присваивается значение 1, переменной b – значение 3. Затем вызывается функция max с параметрами 1 и 3, и ее результат присваивается переменной m.

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

x + y – 12; // сложить значения x и y и

// затем вычесть 12

func(d, 12, x) // вызвать функцию func с

// заданными параметрами

4.3 Объявления имен

Эти операторы объявляют имена, т.е. делают их известными программе. Все идентификаторы или имена, используемые в программе на языке Си++, должны быть объявлены.

Оператор объявления состоит из названия типа и объявляемого имени:

int x; // объявить целую переменную x

double f; // объявить переменную f типа

// double

const float pi = 3.1415;

// объявить константу pi типа float

// со значением 3.1415

Оператор объявления заканчивается точкой с запятой.

4.4 Операторы управления

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

4.5 Условные операторы

Условные операторы позволяют выбрать один из вариантов выполнения действий в зависимости от каких-либо условий. Условие – это логическое выражение, т.е. выражение, результатом которого является логическое значение true (истина) или false (ложь).

Оператор if выбирает один из двух вариантов последовательности вычислений.

if (условие)

оператор1

else

оператор2

Если условие истинно, выполняется оператор1, если ложно, то выполняется оператор2.



if (x > y)

a = x;

else

a = y;

В данном примере переменной a присваивается значение максимума из двух величин x и y.

Конструкция else необязательна. Можно записать:

if (x < 0)

x = -x;

abs = x;

В данном примере оператор x = -x; выполняется только в том случае, если значение переменной x было отрицательным. Присваивание переменной abs выполняется в любом случае. Таким образом, приведенный фрагмент программы изменит значение переменной x на его абсолютное значение и присвоит переменной abs новое значение x.

Если в случае истинности условия необходимо выполнить несколько операторов, их можно заключить в фигурные скобки:

if (x < 0) {

x = -x;

cout << "Изменить значение x на

противоположное по знаку";

}

abs = x;

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

Условный оператор можно расширить для проверки нескольких условий:

if (x < 0)

cout << "Отрицательная величина";

else if (x > 0)

cout << "Положительная величина";

else

cout << "Ноль";

Конструкций else if может быть несколько.

Хотя любые комбинации условий можно выразить с помощью оператора if, довольно часто запись становится неудобной и запутанной. Оператор выбора switch используется, когда для каждого из нескольких возможных значений выражения нужно выполнить определенные действия. Например, предположим, что в переменной code хранится целое число от 0 до 2, и нам нужно выполнить различные действия в зависимости от ее значения:

switch (code) {

case 0:

cout << "код ноль";

x = x + 1;

break;

case 1 :

cout << "код один";

y = y + 1;

break;

case 2:

cout << "код два";

z = z + 1;

break;

default:

cout << "Необрабатываемое значение";

}

В зависимости от значения code управление передается на одну из меток case. Выполнение оператора заканчивается по достижении либо оператора break, либо конца оператора switch. Таким образом, если code равно 1, выводится "код один", а затем переменная y увеличивается на единицу. Если бы после этого не стоял оператор break, то управление "провалилось" бы дальше, была бы выведена фраза "код два", и переменная z тоже увеличилась бы на единицу.

Если значение переключателя не совпадает ни с одним из значений меток case, то выполняются операторы, записанные после метки default. Метка default может быть опущена, что эквивалентно записи:

default:

; // пустой оператор, не выполняющий

// никаких действий

Очевидно, что приведенный пример можно переписать с помощью оператора if:



if (code == 0) {

cout << "код ноль";

x = x + 1;

} else if (code == 1) {

cout << "код один";

y = y + 1;

} else if (code == 2) {

cout << "код два";

z = z + 1;

} else {

cout << "Необрабатываемое значение";

}

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

4.6 Операторы цикла

Предположим, нам нужно вычислить сумму всех целых чисел от 0 до 100. Для этого воспользуемся оператором цикла for:



int sum = 0;

int i;

for (i = 1; i <= 100; i = i + 1)

// заголовок цикла

sum = sum + i; // тело цикла

Оператор цикла состоит из заголовка цикла и тела цикла. Тело цикла – это оператор, который будет повторно выполняться (в данном случае – увеличение значения переменной sum на величину переменной i). Заголовок – это ключевое слово for, после которого в круглых скобках записаны три выражения, разделенные точкой с запятой. Первое выражение вычисляется один раз до начала выполнения цикла. Второе – это условие цикла. Тело цикла будет повторяться до тех пор, пока условие цикла истинно. Третье выражение вычисляется после каждого повторения тела цикла.

Оператор for реализует фундаментальный принцип вычислений в программировании – итерацию. Тело цикла повторяется для разных, в данном случае последовательных, значений переменной i. Повторение иногда называется итерацией. Мы как бы проходим по последовательности значений переменной i, выполняя с текущим значением одно и то же действие, тем самым постепенно вычисляя нужное значение. С каждой итерацией мы подходим к нему все ближе и ближе. С другим принципом вычислений в программировании – рекурсией – мы познакомимся в разделе, описывающем функции.

Любое из трех выражений в заголовке цикла может быть опущено (в том числе и все три). То же самое можно записать следующим образом:



страница 1 страница 2 ... страница 6 страница 7


Смотрите также:





      следующая страница >>

скачать файл




 



 

 
 

 

 
   E-mail:
   © zaeto.ru, 2018