- •Структуры
- •Массив структур
- •Указатели на структуру
- •Битовые поля
- •Объединения
- •Перечисления
- •Переименование типов
- •Открытие файла
- •Функции работы с файлами
- •Форматный ввод/вывод
- •Ввод/вывод строк. Функции позиционирования
- •Чтение из двоичного файла и запись в него
- •Свойства ООП
- •1.1 Свойства ООП
- •Понятие класса в С++
- •1.2 Понятие класса С++
- •Создание класса
- •1.3 Создание класса
- •Члены класса
- •1.4 Члены класса
- •Инкапсуляция
- •1.5. Инкапсуляция
- •1.6 Функции-члены класса
- •Реализация понятия «дата» при помощи структуры
- •1.7 Реализация понятия «дата» при помощи структуры
- •Реализация понятия «дата» при помощи класса
- •1.8 Реализация понятия «дата» при помощи класса
- •Определение и вызов функций–членов класса
- •Выводы. Примеры
- •1.9 Выводы
- •1.10 Пример создания класса
- •Конструкторы
- •2.1 Конструкторы
- •2.2 Пример класса без конструктора
- •2.3 Пример класса с конструктором
- •2.4. Конструктор с параметрами по умолчанию
- •2.5. Деструкторы
- •2.6. Пример класса с конструктором и деструктором
- •2.7. Подставляемые или inline функции.
- •2.8. Подставляемые функции-члены.
- •2.9. Указатель this
- •2.10. Использование указателя this
- •Дружественные функции
- •3.1 Дружественные функции
- •3.2 Пример дружественной функции
- •3.3 Дружественные классы
- •3.4. Уточнение имени элемента.
- •3.5. Определение переменных непосредственно перед использованием
- •3.6. Статические элементы класса.
- •2.7. Пример
- •Перегруженные функции
- •4. Перегрузка функций и операций
- •4.1 Полиморфизм
- •4.2 Перегруженные функции
- •4.3 Перегрузка конструктора
- •4.4 Выбор экземпляра функции
- •4.5 Перегрузка стандартных операций
- •4.6 Перегрузка операций сложения и присваивания
- •4.7 Перегрузка операций ++ и --
- •4.8 Дружественные функции-операции
- •4.9 Перегрузка операции индексации []
- •4.10 Аргументы по умолчанию
- •5. Работа с объектами
- •5.1 Ссылки в С++
- •5.2 Передача объектов, как аргументов функции
- •5.3 Массивы объектов
- •5.4 Указатель на объект
- •5.5 Динамическое выделение памяти. Операторы new, delete.
- •5.6 Локальные классы
- •5.7 Вложенные классы
- •5.8 Имена заголовочных файлов в С++
- •5.9 Строковые переменные в С++.
- •6. Наследование
- •6.1 Понятие наследования
- •6.2 Базовые и производные классы
- •6.3 Одиночное и множественное наследование
- •6.4 Управление доступом производных классов
- •6.5 Пример
- •6.6 Конструкторы с параметрами при наследовании
- •6.7 Конструкторы при множественном наследовании
- •7. Виртуальные функции. абстрактные классы
- •7.1 Указатели на производные типы
- •7.2 Виртуальные функции
- •7.3 Пример
- •7.4 Чистые виртуальные функции и абстрактные типы
- •7.5 Виртуальные базовые классы
- •7.6 Шаблоны
- •7.7 Шаблоны функций
- •7.8 Пример
- •7.9 Использование шаблонов с двумя типами параметров
- •7.10 Шаблоны классов
Структуры
A.1 Пользовательские типы данных
В реальных задачах информация, которую требуется обрабатывать, может иметь достаточно сложную структуру. Для ее адекватного представления используются типы данных, построенные на основе простых типов данных, массивов и указателей.
Одна из главных особенностей языка С++ – это возможность создавать данные новых типов. Кроме известных основных типов данных С предоставляет пять способов создания своих типов данных:
·Структура - это совокупность переменных, объединенных одним именем. Она называется составным типом данных. (Также часто используется термин «смешанный тип данных»).
·Битовое поле - это разновидность структуры, предоставляющая легкий доступ к отдельным битам.
·Объединение позволяет одному участку памяти содержать два или более различных типов данных.
·Перечисление - это список символов.
·Ключевое слово typedef создает новое имя существующему типу.
11.2 Структура
Структура - это совокупность переменных, объединенных одним именем, предоставляющая общепринятый способ совместного хранения информации. Обычно все члены структуры связаны друг с другом. Например, информация об имени и адресе, находящаяся в списке рассылки, обычно представляется в виде структуры. Для книг это может быть название, автор, количество страниц; для окружности — координаты центра, диаметр, цвет.
Для создания структуры необходимо сначала объявить её, задать шаблон (наполнение), т. е. имена и типы данных, входящих в структуру. Ключевое слово struct сообщает компилятору об объявлении структуры.
Переменные, образующие структуру, называются членами структуры. (Члены структуры также часто называются элементами или полями).
Объявление структуры делается так:
struct имя структуры
{тип и имя элемента структуры 1;
тип и имя элемента структуры 2;
…
тип и имя элемента структуры n};
Например, определим структуру, описывающую студентов вуза.
struct student { |
|
|
char name[30]; |
//имя |
30 байт |
int kurs; |
//курс |
4 байта |
char group[5]; |
//группа |
5 байт |
int stip }; |
//стипендия |
4 байта |
Объявление структуры начинается с ключевого слова struct, дальше следует имя структуры – student. В “{}”указываются элементы структуры. Структура является оператором, поэтому заканчивается “;”.
При объявлении структуры память не выделяется, никакая переменная не создается, а задаётся только новый тип данных.
Объявление переменных типа “структура” осуществляется следующим образом:
struct student st1, st2;
При этом под каждую переменную (st1, st2) выделена память объёмом 39 байт.
Задание шаблона и объявление переменных может производиться в одном операторе.
struct student {…} st1, st2;
Для определения структуры сохраняется понятие области видимости. При размещении шаблона: внутри функции – им можно пользоваться только внутри функции; за пределами функции – можно пользоваться в любом месте программы. Шаблон может быть внешним (глобальным), а переменная – внутренней (локальной).
Сама переменная типа “структура” может быть
·глобальной
·локальной
·параметром функции
А.3 Инициализация элементов структуры.
Переменная-структура позволяет объединить под одним именем ряд разнородных данных. Обычно это нужно для удобства обработки данных. Если нельзя было бы создавать структуры, то пришлось бы создавать множество независимых переменных или ряд массивов, явной взаимосвязи между которыми не было бы. Структуру же позволяют объединять взаимосвязанные данные.
Объявив переменную структурного типа, мы можем получить доступ к каждому ее элементу для присваивания, изменения или получения значения.
Доступ к элементам структуры осуществляется при помощи операции точка (dot). За именем структурной переменной следует точка, а за ней имя члена, к которому происходит обращение. Ко всем членам структуры доступ осуществляется точно таким же способом. Стандартный вид доступа следующий:
имя_структуры.имя_члена
Пример:
strcpy(st1.name, “Иванов”);
st1.kurs=2;
printf(“%s”,st.group);
Значение элементов структуры можно сразу определять при объявлении переменной, что похоже на инициализацию массивов:
Задать начальные значения элементам структуры можно в момент создания переменной типа “структура”.
struct student st={“Петров”,1, “A”, 600};
Массив структур
А.4 Массив структур
Обычно создание в программе одной переменной структурного типа не имеет особого смысла. Чаще структурами пользуются, когда необходимо описать множество похожих объектов, имеющих разные значения признаков. Значения каждого объекта следует объединить вместе (в структуру) и тем самым отделить от значений других объектов. Например, описание ряда книг или множества студентов. Таким образом мы можем организовать массив, где каждый элемент представляет собой отдельную структуру, а все элементы принадлежат одному и тому же структурному типу.
Для объявления массива структур следует задать шаблон структуры, а затем объявить массив.
struct student sgr61[25];
Такой оператор создаёт в памяти 25 переменных типа “структура” с шаблоном student и именами
sgr61[0];
sgr61[1];
. . .
sgr61[24];
Обращение к элементам массива структур будет выглядеть следующим образом:
sgr61[1].stip
sgr61[6].name
Если объявлены две переменные типа структура с одним шаблоном, можно сделать присваивание. При этом произойдёт побитовое копирование каждого поля одной переменной в соответствующее поле другой структуры.
Нельзя использовать операцию присваивания, если шаблоны одинаковы, но описаны под разными именами.
А.5 Пример: заполнение и вывод списка студентов группы
#include <stdio.h> #define MAX 25 struct student { char name[30]; int kurs;
char group[5] int stipi}; main()
{struct student [MAX]; int count=0, i;
printf(“Введите число студентов:\n”); scanf(“%d”,& count);
for (i=0, i<count; i++)
{printf(“введите имя:\n”); scanf(“%s”,stud[i].name); printf(“введите курс:\n”); scanf(“%d”,&stud[i].kurs); printf(“введите группу:\n”); scanf(“%s”,stud[i].group); printf(“введите стипендию:\n”); scanf(“%d”,&stud[i].stip);
}
printf(“ваш список:\n”); for (i=0; i<count; i++)
printf(“%20s%6d%10s%6d\n”,stud[i].name,stud[i].kurs,stud[i].group,stud[i].stip); }