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

Sb97282

.pdf
Скачиваний:
1
Добавлен:
13.02.2021
Размер:
998.17 Кб
Скачать

МИНОБРНАУКИ РОССИИ

–––––––—————––––––––––––—————––––––––––––

Санкт-Петербургский государственный электротехнический университет «ЛЭТИ» им. В. И. Ульянова (Ленина)

——————————————————––––——

ОСНОВЫ ПРОГРАММИРОВАНИЯ НА С++

Учебно-методическое пособие

Санкт-Петербург Издательство СПбГЭТУ «ЛЭТИ»

2018

УДК 004.43 (07) ББК З 973.2–018.1я7 О75

Авторы: Н. И. Куракина, Е. С. Сулоева, Ф. Я. Беляев, П. Е. Антонюк.

О75 Основы программирования на С++: учеб.-метод. пособие. СПб.: Изд-во СПбГЭТУ «ЛЭТИ», 2018. 40 с.

ISBN 978-5-7629-2349-1

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

На практических занятиях и лабораторных работах вырабатываются навыки программирования на С++ в интегрированной среде разработки

Dev C++ 5.2.

Предназначено для студентов направления «Приборостроение», также может быть использовано преподавателями вузов и аспирантами.

УДК 004.43 (07) ББК З 973.2–018.1я7

Рецензенты: кафедра прикладной математики и информатики Высшей школы технологий и энергетики СПбГУПТД; д-р техн. наук В. М. Пестриков (СПбГИКиТ).

Утверждено редакционно-издательским советом университета

в качестве учебно-методического пособия

ISBN 978-5-7629-2349-1

© СПбГЭТУ «ЛЭТИ», 2018

ВВЕДЕНИЕ

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

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

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

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

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

3

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

Объектно-ориентированное программирование – это новый подход (метод) программирования, в основе которого лежит понятие объекта. Объект – это логическая единица, которая содержит данные и правила (методы) обработки этих данных. В С++ в качестве правил выступают функции, таким образом объект – это данные + функции, работающие с этими данными. Внутри объекта данные и функции могут быть частными или закрытыми (private), защищенными (protected) или открытыми (public).

Объектом является переменная определенного пользователем типа, при этом основными характеристиками объектно-ориентированного программирования являются:

инкапсуляция;

наследование;

полиморфизм;

абстракции типов.

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

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

ски связанных, но различных целей. Пример: выполнение одинаковых действий над различными типами данных.

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

1.1. Понятия класса С++

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

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

4

Характерные элементы класса:

1)средства контроля доступа;

2)конструкторы;

3)деструкторы;

4)элементы-данные;

5)функции-члены;

6)специально скрытый указатель this. Основные положения:

1. Класс, как и структура, предварительно должен быть объявлен (при

помощи создания шаблона класса.

2.Доступ к элементам класса может быть разрешен только набору функций, объявленных как часть класса (функциям-членам).

3.Объекты класса создаются и инициализируются специальными функциями, называемыми конструкторами.

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

Рассмотрим реализацию понятия «данных» с использованием структуры: struct date

{

int day, month, year; };

struct date today;

void set (date *, int, int, int); void next (date *);

void print (date *);

Строка struct date today; отвечает за создание объекта типа struct day. Перечисленные функции не связаны с объектом. Эту связь можно установить, описав функции как члены:

struct date

{

int day, month, year; void set (int, int, int); void next (void); void print (void);

};

5

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

struct date today; struct date my birthday;

my birthday. set (10, 2, 1989); today. set (16, 2, 2007); today. next ();

today. day =5; обращение объекта today к элементу day.

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

void date:: print (void)

{

cout<<day<<month<<year;

}

и определение функции:

date:: – принадлежность функции print к структуре date.

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

today. print();– вызов функции.

Функции не являются единственными для доступа к элементам структуры day. Это ограничение можно наложить, если объявить структуру как класс.

Пример: class date

{

private:

int day, month, year; public:

void set (int, int, int); void next (void); void print (void);

};

6

Объявлен новый тип данных: класс day. Класс может содержать закрытую (private) и общую (public) часть. По умолчанию все элементы класса закрытые. Поэтому ключевое слово private в данном примере можно убрать.

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

Открытая часть – это переменные и функции, доступные для всех других функций программы и объявленные после ключевого слова public. Открытая часть представляет интерфейс к объекту класса.

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

Защищенный режим доступа protected используется при наследовании класса.

Ключевые слова: private, public, protected могут встречаться в шаблоне класса в любом порядке, любое количество раз, однако хорошим стилем программирования считается описание один раз.

После создания класса можно объявить объект этого класса: date dat1, dat2;

где date – имя класса; dat1, dat2 – имена объектов. Таким образом, создано два объекта класса day.

1.2. Описание и вызов функций-членов класса

Описание функции-члена класса осуществляется при помощи операции принадлежности :: , которая определяет, к какому классу относится эта функция:

void date:: print (void)

{

cout<<day<<month<<year;

}

void date:: set (int a, int b, int c)

{

day=a; month=b; year=c;

}

Имя date::print называется полным или квалифицированным именем функции-члена класса. Чтобы вызвать функцию-член класса необходимо использовать имя объекта и операцию (.).

7

dat1. print ();

dat2. set (2, 2, 2002);

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

На практике объявление класса (создание шаблона) и описание функ- ций-членов, как правило, осуществляется до main, так как не требует выделения памяти.

Класс – это не объектные переменные, а типы (шаблоны) для создания объектов.

Общий вид шаблона класса: Class имя класса {

private:

-||-||-||- protected:

-||-||-||- public:

-||-||-||-

};

При объявлении класса используются прототипы функции-члена класса. После описания класса можно объявить несколько объектов класса в качестве экземпляра этого класса:

date dat1,dat2;

Для доступа к элементам класса можно использовать три способа указания имени объекта.

1.Указание полного (квалифицированного) имени функции: dat1.date::print();

2.Непосредственное указание имени объекта и (.): dat1.print();

Второй вариант записи возможен в случае однозначности определения принадлежности функции print к классу dat.

8

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

3. Через указатель: date *s;

*s = &dat1; s->print();

Пример: создать класс, реализующий сумму двух целых чисел.

# include <iostream.h> class sum

{

int x,y,z;

public: void get xy (int x1, int y1); void summa (void);

};

void sum :: get xy (int x1, int y1) { x=x1; y=y1;}

void sum :: summa (void) {z= x+y;}

void main()

{

sumz;

intx2=y2;

cout<<”Введите первое слагаемое: \n”; cin>>x2;

cout<<”Введите второе слагаемое: \n”; cin>>y2;

z. get xy (x2,y2); z. summa();

}

2. КОНСТРУКТОРЫ И ДЕСТРУКТОРЫ

Для большинства объектов естественно требовать, чтобы они были инициализированы до начала их использования. В C++ автоматическая инициализация реализуется использованием функции, называемой конструктором.

9

Конструктор – специальная функция, являющаяся членом класса и имеющая то же имя, что и класс. Для конструктора не указывается тип возвращаемого значения (даже void недопустим).

Пример:

# include <iostream.h> class sum

{

int x, y, z;

public: sum (int x1; int y1); void summa (void);

};

sum:: sum (int x1=0, int y1) { x=x1; y=y1; }

void sum:: summa (void) { z= x+y; }

void main ()

{

int x2; y2;

cout<<”Введите первое слагаемое: \n”; cin>>x2;

cout<<”Введите второе слагаемое: \n”; cin>>y2;

sum.z (x2, y2); z.summa ();

}

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

1. Имя класса_ имя объекта = имя конструктора (список аргументов): sumz = sum(5,7);

10

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