- •1.1.Указатели
- •1.1.1.Объявление указателей и работа с адресами
- •1.1.2.Адресная арифметика
- •1.1.3.Указатели как формальные параметры функции
- •1.1.4.Связь указателей и массивов
- •1.1.5.Константные указатели и указатели на константы
- •1.1.6.Связь указателей и строк
- •1.1.7.Преобразование указателей
- •1.1.8.Бестиповые указатели
- •1.1.9.Массив указателей
- •1.1.10.Указатели на указатели
- •1.1.11.Резервирование и освобождение памяти (операторы new и delete)
- •1.2.Типы данных, определяемые пользователем
- •1.2.1.Переопределяемые типы данных
- •1.2.2.Структуры
- •1.2.2.1.Массивы структур
- •1.2.2.2.Использование указателей на структуры
- •1.2.2.4.Динамические структуры и массивы структур
- •1.2.3.Классы
- •1.2.3.1.Введение в ооп
- •2.1.Потоки
- •2.2.Стандартные потоки
- •2.4.Файловые потоки
- •2.4.1.Общие принципы работы с файлами
- •2.4.2.Режимы открытия файлов
- •2.4.3.Текстовые и бинарные файлы и файловые потоки
- •2.4.4.Проверка состояния файла и потока
- •2.4.5.Функции (методы) ввода-вывода
- •2.4.5.1.Методы get и put
- •2.4.5.2.Метод getline
- •2.4.5.3.Методы read и write
- •2.4.6.Особенности работы с бинарными файлами
- •2.4.7.Использование текущей позиции файла
1.2.2.1.Массивы структур
Как видно из шаблона структуры Worker, массивы могут быть элементами структур. В свою очередь и переменные одного и того же структурного типа могут объединяться в массивы. Пример объявления массива структур:
Worker staff [100]; // массив из 100 структур типа Worker
При инициализации массивов структур удобно заключать в фигурные скобки список значений для каждой структуры:
Worker worker[2] = { { 3124, "Ivanoff", 31, 3400.55},
{ 3125, "Petroff", 35, 3900.00} };
Можно не структурировать фигурными скобками данные для инициализации, тогда они будут присваиваться полям структур в порядке их расположения.
Пример доступа к полям массива структур:
staff[8].age = 30;
cout <<staff[5].fio;
char c = staff[7].fio[0];
1.2.2.2.Использование указателей на структуры
Можно объявить указатель на структуру:
// определение указателя на тип Worker
Worker *pw;
а затем присвоить ему адрес существующей переменной указанного типа:
pw = &worker; // worker – переменная типа Worker
Объявление и инициализацию указателя, как обычно, можно совместить:
Worker *pw = &worker;
Для доступа к элементам (полям) структуры через указатель используется операция -> (“стрелка”, селектор):
pw->salary = 150000;
1.2.2.3.Об операциях . и –>
Операция –> является кратким способом записи доступа к значению структуры по ее адресу. Другой, более подробный способ записи предыдущего оператора:
(*pw).salary = 150000;
Операции . и –>, наряду с операцией индексирования [], имеют наивысший приоритет среди всех операций (выше, чем унарные).
Поэтому, например, код
Worker *pw = staff;
++pw->code;
увеличит значение переменной code начальной (с нулевым индексом) структуры массива структур staff, а не значение указателя pw.
1.2.2.4.Динамические структуры и массивы структур
Память под структуру и массив структур можно выделять динамически:
Worker *pw = new Worker; // выделение памяти для структуры
pw->age=28;
pw->code=3983;
Worker *pwd = new Worker[k]; // выделение памяти для массива из k структур
Освобождение выделенной памяти осуществляется с помощью оператора delete:
delete pw;
delete [] pwd;
Обращение к полям элементов динамического массива структур можно осуществлять любым из возможных способов – с помощью операций индексирования, . или ->, например:
pwd[2].age=28;
(pwd+2)->code=3983;
(*(pwd+2)).salary=35000;
(скобки необходимы, так как приоритет операций . и –> выше, чем приоритет операции *).
Легко догадаться, что способы доступа к полям элементов статического массива структур те же, поскольку массив в C++ реализован как указатель на его начало:
Worker staff[100];
...
int nAge = staff[1].age;
int iCode = (staff+2)->code;
int iAge = (*(staff+2)).age;
Динамический массив структур можно реализовать как массив указателей.
Комбинируя структуры и массивы можно строить достаточно сложные, универсальные и гибкие структуры данных.
В языке C++ структура является видом класса и обладает всеми его свойствами, но во многих случаях достаточно использовать структуры так, как они определены в языке С.
1.2.3.Классы
Класс можно рассматривать как сложный тип данных, включающий в себя поля данных одного или различных типов, а также функции, предназначенные для работы с ними. Переменные такого типа данных называют объектами.
Идея классов отражает внутреннюю организацию и функционирование объектов реального мира, ведь каждый предмет или процесс обладает набором характеристик (свойствами) и отличительных черт (поведением), которые можно представить данными соответствующих типов и функциями (методами работы с ними).
