
- •220300 - Системы автоматизированного проектирования
- •Тема 2. Технологии программирования
- •Тема 2. Технология разработки крупных приложений
- •Структуры
- •Структуры и функции
- •Массивы структур
- •Поиск в массиве структур
- •Вложенность структур
- •Рекурсия
- •Алгоритм быстрой сортировки
- •Массивы структур и бинарные файлы
- •Динамические структуры данных
- •Линейные списки
- •Очереди
- •Контрольная работа
- •Объектно-ориентированное программирование. Классы
- •Конструкторы
- •Перегруженные конструкторы
- •Определение методов класса вне класса
- •Объекты, возвращаемые функцией (методом)
- •Структуры и классы
- •Классы и память
- •Статические данные класса
- •Константные методы
- •Деструкторы
- •Массивы и классы
- •Массивы объектов
- •Строки Строковый тип или стандартный класс string
- •Тип строк AnsiString
- •Перегрузка операций
- •Перегрузка арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операции приведения типа
- •Преобразования объектов в основные типы и наоборот
- •Преобразование объектов классов в объекты других классов
- •Наследование
- •Конструкторы производного класса
- •Перегрузка функций
- •Иерархия классов
- •Общее и частное наследование. Комбинации доступа
- •Множественное наследование
- •Включение. Классы в классах
- •Виртуальные и дружественные функции
- •Абстрактные классы и чистые виртуальные функции
- •Виртуальные деструкторы
- •Виртуальные базовые классы или устранение неоднозначности при множественном наследовании
- •Дружественные функции
- •Дружественные классы
- •Указатель this
- •Многофайловые программы
- •Распознавание нажатых клавиш
Структуры
В языке С++ структура является видом класса и обладает всеми его свойствами. Как правило, описание структуры определяет новый (абстрактный) тип данных, имя которого можно использовать в дальнейшем наряду со стандартными типами. Структуры предназначены для объединения некоторого количества переменных стандартных типов. В структуру, в противоположность массиву, можно объединять данные различных типов. Синтаксис структуры фактически идентичен синтаксису класса. Только структуры, как правило, используют в качестве объединения данных, а классы – в качестве объединения данных и функций.
Рассмотрим структуру, содержащую три поля и предназначенную для хранения информации о товарах, хранящихся на складе.
const int N=30;
struct Tovar {
char name[N]; //наименование товара
int number; //номер товара
float cena;
}; // точка с запятой !
int main() {
Tovar t1; // новый тип данных
cout << "\nVvedite naimenovanie tovara: "; cin.get(t1.name, N);
cout << "Vvedite nomer tovara: "; cin >> t1.number;
cout << "Vvedite stoimost tovara: "; cin >> t1.cena;
cout << "\n\nNaimenovanie tovara: " << t1.name
<< " Nomer tovara: " << t1.number
<< " Stoimost tovara: " << t1.cena;
getch(); return 0;
}
В приведённой программе присутствуют три основных аспекта работы со структурами: определение структуры, определение переменной типа этой структуры и доступ к полям этой структуры. Само определение структуры (struct Tovar {};) не создаёт никаких переменных, т.е. не происходит ни выделения физической памяти, ни объявления переменной. В то же время определение обычной переменной предполагает выделение памяти под неё.
Когда происходит определение структурной переменной (Tovar t1;), то под структурную переменную всегда отводится столько памяти, сколько достаточно для хранения всех её полей.
Доступ к полям структуры выполняется с помощью операций выбора:
. (точка) при обращении к полю через имя структуры;
-> при обращении через указатель.
struct Tovar {
char name[N]; //наименование товара
int number; //номер товара
float cena;
}; // точка с запятой !
…
Tovar t2, *pt;
t2.name="sanki derevyannye";
pt->cena=321.65; //или (*pt).cena=321.65;
Инициализацию полей переменной t1 можно произвести в момент её определения: Tovar t1 = { "sanky metal.", 3373, 217.55 };. Каждая из величин присваивается по очередности соответствующему полю. Также можно присваивать значение одной структурной переменной другой структурной переменной: t2 = t1; . Не допускается применение таких операций, как t3=t2+t1; .
Структуры и функции
Использование структурных переменных с функциями подчиняется правилам для обычных переменных стандартных типов. Структурные переменные можно передавать в функцию по значению, по ссылке или по указателю. Также допускается использование структурной переменной в качестве возвращаемого значения. При разделении логически законченных действий программы на функции, надо иметь в виду, что структура, в отличие от массива, может быть возвращаемым значением функции. Структура может передаваться в функцию по константной ссылке, а также и по значению, что несколько хуже, потому что в этом случае затрачивается время на копирование и требуется дополнительное место в стеке параметров.