Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

5009

.pdf
Скачиваний:
1
Добавлен:
05.02.2023
Размер:
1.84 Mб
Скачать

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)

Кафедра моделирования и системного анализа

Ганджа Т.В., Панов С.А.

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ

Курс лекций

Томск

2015

Ганджа Т.В., Панов С.А. Объектно-ориентированное программирование / Курс лекций – Томск: Томский государственный университет систем управления и радиоэлектроники, Кафедра моделирования и системного анализа,

2015. – 101 с.

©Ганджа Т.В., 2015.

©Панов С.А., 2015.

©ТУСУР, Кафедра моделирования и системного анализа, 2015.

2

 

 

 

Содержание

 

1.

Структурное программирование..........................................................................................

6

 

1.1

Структура программы ...............................................................................................

6

 

1.2

Операции ....................................................................................................................

7

 

1.2.1

Инкремент и декремент ........................................................................................

7

 

1.2.2 Операция определения размера sizeof .................................................................

8

 

1.2.3

Операции отрицания .............................................................................................

8

 

1.2.4 Деление и остаток от деления ..............................................................................

8

 

1.2.5

Операции сдвига ....................................................................................................

9

 

1.2.6

Операции отношения ............................................................................................

9

 

1.2.7

Поразрядные операции .........................................................................................

9

 

1.2.8

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

9

 

1.2.9

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

10

 

1.2.10 Условная операция (? 7:).................................................................................

10

 

1.3

Выражения ...............................................................................................................

11

 

1.4

Базовые конструкции структурного программирования.....................................

12

 

1.4.1

Оператор «выражение».......................................................................................

12

 

1.4.2

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

13

 

1.4.2.1

Условный оператор if ...............................................................................

13

 

1.4.2.2

Оператор switch.........................................................................................

14

 

1.4.3

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

15

 

1.4.3.1 Цикл с предусловием (while) ..................................................................

16

 

1.4.3.2 Цикл с постусловием (do while) .............................................................

17

 

1.4.3.3

Цикл с параметром...................................................................................

18

 

1.4.4

Операторы передачи управления.......................................................................

19

 

1.4.4.1

Оператор goto ............................................................................................

20

 

1.4.4.2

Оператор break..........................................................................................

20

 

1.4.4.3

Оператор continue.....................................................................................

21

 

1.4.4.4

Оператор return .........................................................................................

21

 

1.5

Указатели и массивы ...............................................................................................

21

 

1.5.1

Указатели..............................................................................................................

21

 

1.5.1.1

Инициализация указателей....................................................................

22

 

1.5.1.2

Операции с указателями.........................................................................

24

 

1.5.2

Ссылки ..................................................................................................................

26

 

1.5.3

Массивы................................................................................................................

26

 

1.5.3.1

Одномерные массивы .............................................................................

26

 

1.5.3.2

Динамические массивы ...........................................................................

28

 

1.5.3.3

Многомерные массивы............................................................................

29

 

1.5.4

Строки...................................................................................................................

30

 

1.6

Типы данных, определяемые пользователем........................................................

32

 

1.6.1

Переименование типов (typedef) ........................................................................

32

 

1.6.2

Перечисления(enum) ...........................................................................................

33

 

1.6.3

Структуры (struct)................................................................................................

33

 

1.6.4

Битовые поля........................................................................................................

35

 

1.6.5

Объединения (union) ...........................................................................................

35

2.

Модульное программирование ..........................................................................................

38

 

2.1

Функции ...................................................................................................................

38

 

2.1.1 Объявление и определение функций.................................................................

38

 

2.1.2

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

41

 

2.1.3

Возвращаемое значение ......................................................................................

41

 

2.1.4

Параметры функции ............................................................................................

41

 

2.1.4.1 Передача массивов в качестве параметров......................................

42

3

2.1.4.2 Передача имен функций в качестве параметров .............................

44

2.1.4.3 Параметры со значениями по умолчанию .........................................

44

2.1.4.4 Функции с переменным числом параметров .....................................

45

2.1.5

Рекурсивные функции.........................................................................................

45

2.1.6

Перегрузка функций............................................................................................

46

2.1.7

Шаблоны функций ..............................................................................................

47

2.1.8

Функция main() ....................................................................................................

49

2.2

Директивы препроцессора......................................................................................

50

2.2.1

Директива #include ..............................................................................................

50

2.2.2

Директива #define ................................................................................................

51

2.2.3

Директивы условной компиляции .....................................................................

51

2.2.4

Директива #undef .................................................................................................

52

2.2.5

Предопределенные макросы ..............................................................................

52

2.3

Области действия идентификаторов .....................................................................

53

2.3.1

Внешние объявления...........................................................................................

54

2.3.2

Поименованные области.....................................................................................

55

2.4

Динамические структуры данных..........................................................................

57

2.4.1

Линейные списки.................................................................................................

57

2.4.2

Стеки .....................................................................................................................

61

2.4.3

Очереди.................................................................................................................

62

2.4.4

Бинарные деревья ................................................................................................

63

2.4.5 Реализация динамических структур с помощью массивов .............................

66

3. Объектно-ориентированное программирование ..............................................................

67

3.1

Классы ......................................................................................................................

69

3.1.1

Описание класса ..................................................................................................

69

3.1.2

Описание объектов ..............................................................................................

71

3.1.3

Указатель this .......................................................................................................

72

3.1.4

Конструкторы ......................................................................................................

72

3.1.4.1

Конструктор копирования .......................................................................

74

3.1.5

Статические элементы класса ............................................................................

75

3.1.5.1

Статические поля......................................................................................

75

3.1.5.2

Статические методы ................................................................................

76

3.1.6 Дружественные функции и классы....................................................................

76

3.1.6.1

Дружественная функция .........................................................................

76

3.1.6.2

Дружественный класс ..............................................................................

77

3.1.7

Деструкторы.........................................................................................................

77

3.1.8

Перегрузка операций...........................................................................................

78

3.1.8.1

Перегрузка унарных операций ..............................................................

79

3.1.8.2

Перегрузка бинарных операций............................................................

80

3.1.8.3

Перегрузка операции присваивания ....................................................

80

3.2

Наследование ...........................................................................................................

81

3.2.1

Ключи доступа .....................................................................................................

81

3.2.2

Простое наследование.........................................................................................

82

3.2.3

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

84

3.2.3.1

Механизм позднего связывания ...........................................................

86

3.2.3.2

Абстрактные классы.................................................................................

86

3.2.4 Отличия структур и объединений от классов...................................................

87

3.3

Шаблоны классов ....................................................................................................

87

3.3.1

Создание шаблонов классов ...............................................................................

87

3.4

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

94

3.4.1 Общий механизм обработки исключений.........................................................

95

3.4.2

Синтаксис исключений .......................................................................................

95

4

3.4.3

Перехват исключений .........................................................................................

96

3.4.4

Список исключений функции ............................................................................

98

3.4.5 Исключения в конструкторах и деструкторах..................................................

99

3.4.6

Иерархии исключений ......................................................................................

100

Контрольные вопросы...............................................................................................................

101

5

1. Структурное программирование

1.1Структура программы

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

тип_возвращаемого_значения имя([параметры])

{

операторы, составляющие тело функции

}

Как правило, функция используется для вычисления какого-либо значения, поэтому перед именем функции указывается его тип:

если функция не должна возвращать значение, указывается тип void (подробнее типы данных рассмотрим на следующей лекции);

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

функции не могут быть вложенными;

каждый оператор заканчивается точкой с запятой (кроме составного оператора). Пример структуры программы, содержащей функции main, fl и f2:

Листинг 1.1. Структуры программы

директивы препроцессора описания

int main()

{

операторы главной функции

}

int fl()

{

операторы функции fl

}

int f2()

{

операторы функции f2

}

Программа может состоять из нескольких модулей (исходных файлов).

В языке C++ нет встроенных средств ввода/вывода - он осуществляется с помощью функций, типов и объектов, содержащихся в стандартных библиотеках. Используется два способа: функции, унаследованные из языка С, и объекты C++. Основные функции ввода/вывода в стиле С:

int scanf (const char* format. ... )

// ввод

int printf(const char* format, ... )

// вывод

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

Листинг 1.2. Использование стандартных операторов ввода/вывода языка С

#include <stdio.h> int main()

{

int i:

print("Введите целое число\п"); scanf("Id", &i);

printf(“Вы ввели число %i, спасибо!", i); return 0;

}

6

Первая строка этой программы - директива препроцессора, по которой в текст программы вставляется заголовочный файл <stdiо.h>, содержащий описание использованных в программе функций ввода/вывода (в данном случае угловые скобки являются элементом языка). Все директивы препроцессора начинаются со знака #. Директивы препроцессора будут рассмотрены в пункте 2.2.

Третья строка - описание переменной целого типа с именем i.

Функция printf в четвертой строке выводит приглашение «Введите целое число» и переходит на новую строку в соответствии с управляющей последовательностью \n. Функция scanf заносит введенное с клавиатуры целое число в переменную i (знак & означает операцию получения адреса), а следующий оператор выводит на экран указанную в нем строку, заменив спецификацию преобразования значением этого числа.

Листинг 1.3. Операции ввода/вывода языка С++

#include <iostream.h> int main()

{

int i;

cout « "Введите целое число\n"; cin » i;

cout « "Вы ввели число " « i « ". спасибо!"; return 0;

}

Заголовочный файл <iostream.h> содержит описание набора классов для управления вводом/выводом. В нем определены стандартные объекты-потоки cin для ввода с клавиатуры и cout для вывода на экран, а также операции помещения в поток << чтения из потока >>.

1.2Операции

1.2.1 Инкремент и декремент

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

Листинг 1.4. Использование операций инкремента и декремента

#include <std1o.h> int main()

{

int x = 3, у = 3:

printf("Значение префиксного выражения: %d\n", ++x); printf (“Значение постфиксного выражения: %d\n", у++): printf("Значение х после приращения: %d\n". х); rint(“Значение у после приращения: %d\n", у):

return 0:

}

Результаты программы (листинг 1.4) :

Значение префиксного выражения: 4 Значение постфиксного выражения: 3 Значение х после приращения: 4 Значение у после приращения: 4

Операндом операции инкремента в общем случае является так называемое L-значение (L- value). Так обозначается любое выражение, адресующее некоторый участок памяти, в который можно занести значение. Название произошло от операции присваивания, поскольку именно ее левая (Left) часть определяет, в какую область памяти будет занесен результат операции. Переменная является частным случаем L-значения.

7

1.2.2 Операция определения размера sizeof

Операция определения размера sizeof предназначена для вычисления размера объекта или типа в байтах, и имеет две формы:

sizeof выражение sizeof ( тип )

Листинг 1.5. Пример использования операции sizeof

#indude <iostream.h> int main()

{

float x = 1;

cout « "sizeof (float) :" « sizeof (float); cout « "\nsizeof x :" « sizeof x;

cout « "\nsizeof (x + 1.0) :" « sizeof (x + 1.0): return 0;

}

Результаты работы программы, представленной на листинге 1.5.

sizeof (float) : 4 sizeof x : 4

sizeof (x + 1.0) : 8

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

1.2.3 Операции отрицания

Арифметическое отрицание (унарный минус -) изменяет знак операнда целого или вещественного типа на противоположный. Логическое отрицание (!) дает в результате значение 0, если операнд есть истина (не пуль), и значение 1, если операнд равен нулю. Операнд должен быть целого или вещественного типа, а может иметь также тип указатель. Поразрядное отрицание (-), часто называемое побитовым, инвертирует каждый разряд в двоичном представлении целочисленного операнда.

1.2.4 Деление и остаток от деления

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

Листинг 1.6. Использование операций деления и остаток от деления

#include <stdio.h> int main

{

int x = 11, у = 4: float z = 4;

рrintf(“Результаты деления: %d %f\n”, x/y. x/z); printf("Остаток: %d\n",x%y);

return 0:

}

Результаты работы программы, представленной на листинге 1.6.

Результаты деления: 2 2.750000 Остаток: 3

8

1.2.5 Операции сдвига

Операции сдвига (<< и >>) применяются к целочисленным операндам. Они сдвигают двоичное представление первого операнда влево или вправо на количество двоичных разрядов, заданное вторым операндом. При сдвиге влево (<<) освободившиеся разряды обнуляются. При сдвиге вправо (>>) освободившиеся биты заполняются нулями, если первый операнд беззнакового типа, и знаковым разрядом в противном случае. Операции сдвига не учитывают переполнение и потерю значимости.

1.2.6 Операции отношения

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

1.2.7 Поразрядные операции

Поразрядные операции (&, |, ^) применяются только к целочисленным операндам и работают с их двоичными представлениями. При выполнении операций операнды сопоставляются побитово (первый бит первого операнда с первым битом второго, второй бит первого операнда со вторым битом второго, и т д.).

При поразрядной конъюнкции, или поразрядном И (операция обозначается &) бит результата равен 1 только тогда, когда соответствующие биты обоих операндов равны 1.

При поразрядной дизъюнкции, или поразрядном ИЛИ (операция обозначается |) бит ре-

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

При поразрядном исключающем ИЛИ (операция обозначается ^) бит результата равен 1 только тогда, когда соответствующий бит только одного из операндов равен 1.

Листинг 1.7. Пример использования поразрядных операций

#include <iostream.h> int main

{

cout « "\n 6 & 5 = " « (6 & 5); cout « "\n 6 | 5 = " « (6 | 5); cout « "\n б ^ 5 = " « (6 ^ 5); return 0;

}

Результат работы программы:

б& 5 = 4

6 | 5 = 7

б^ 5 = 3

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

Операнды логических операций И (&&) и ИЛИ (||) могут иметь арифметический тип или быть указателями, при этом операнды в каждой операции могут быть различных типов. Преобразования типов не производятся, каждый операнд оценивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как false, не равный пулю — как true).

Результатом логической операции является true или false. Результат операции логическое И имеет значение true только если оба операнда имеют значение true. Результат операции логическое ИЛИ имеет значение true, если хотя бы один из операндов имеет значение true. Логические операции выполняются слева направо. Если значения первого операнда достаточно, чтобы определить результат операции, второй операнд не вычисляется.

9

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

Операции присваивания могут использоваться в программе как закопченные операторы. Формат операции простого присваивания (=):

операнд_1 = операнд_2

Первый операнд должен быть L-значением, второй — выражением. Сначала вычисляется выражение, стоящее в правой части операции, а потом его результат записывается в область памяти, указанную в левой части (мнемоническое правило: «присваивание — это передача данных "налево"»). То, что ранее хранилось в этой области памяти, естественно, теряется.

Листинг 1.8. Использование операций присваивания

#include <iostream.h> int main()

{

int a = 3, b = 5, с = 7; a = b; b = а;4 с = с + 1: cout « "a = " « a;

cout « "\t b = " « b: cout « "\t с = " « с; return 0;

}

Результат работы программы (листинг 1.8. )

a=5 b=5 c=8

В сложных операциях присваивания ( +=, *=, /= и т п.) при вычислении выражения, сто-

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

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

Эта операция тернарная, то есть имеет три операнда. Ее формат:

операнд_1 ? операнд_2 : операнд_3

Первый операнд может иметь арифметический тип или быть указателем. Он оценивается с точки зрения его эквивалентности пулю (операнд, равный нулю, рассматривается как false, не равный нулю — как true). Если результат вычисления операнда 1 равен true, то результатом условной операции будет значение второго операнда, иначе — третьего операнда. Вычисляется всегда либо второй операнд, либо третий. Их тип может различаться. Условная операция является сокращенной формой условного оператора if.

Листинг 1.9. Использование условной операции

#include <stdio.h> int main()

{

int a = 11, b = 4, max; max = (b > a)? 6 : a;

printf("Наибольшее число: %d”, max); return 0;

}

Результат работы программы листинг 1.9. :

Наибольшее число: 11

Другой пример применения условной операции. Требуется, чтобы некоторая целая величина увеличивалась на 1, если ее значение не превышает n, а иначе принимала значение 1:

i = (i < n) ? i + 1: 1;

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]