Структуры — введение в объектно-ориентированное программирование
Раньше для хранения данных использовались простые типы данных: числа, строки и т.д. Тем не менее, многие объекты, которые возникают в программировании, нельзя охарактеризовать только одной числовой или строковой величиной. Например, точка на плоскости задается парой действительных чисел (x, y), а данные о человеке можно задавать при помощи нескольких строк (фамилии, имени, отчества) и числового параметра: года рождения.
Поэтому удобным является использование объектов, объединяющих сразу ряд параметров, каждый из которых может фигурировать, как отдельная переменная.
Для этого используются специальные типы данных, которые в языке C называются структурами, а в языке C++ – классами. Например, структура Point , задающая точку на плоскости и содержащая два действительных числа x и y может быть задана следующим образом:
struct Point < double x; double y; >;
Переменные x и y , входящие в структуру Point , называются полями структуры. Определение структуры дается вне всех функций (и, обычно делается перед объявлением всех функций). Определение структуры обязательно завершается точкой с запятой.
После этого мы можем работать с Point , как с новым типом данных, содержащим два поля: x и y . Примеры создания переменной и массива переменных типа Point :
Point P, Arr[10];
Чтобы обратиться к полю какой-либо структуры, используется оператор «точка». Его левый операнд – идентификатор переменной типа структура, правый операнд – имя поля. Например, P.x или Arr[i].y .
Например, считать координаты точки, сохранить их в переменной P и вывести на экран расстояние от начала координат до этой точки можно следующим образом:
cin >> P.x >> P.y; coutПо сути, величины P.x и P.y являются независимыми переменными, скомбинированными в один объект. С этим объектом можно работать, как с единым целым, например, можно выполнять присваивания вроде Arr[i]=P , можно сохранить набор точек в одном массиве и т.д.
Аналогично, можно определить структуру типа Person для хранения информации о человеке:
struct Person < string FirstName; // Имя string LastName; // Фамилия int BirthYear; // Год рождения >;Теперь можем работать с данными типа Person :
Person Vasya; Vasya.FirstName = "Василий"; Vasya.LastName = "Пупкин"; Vasya.BirthYear = 1990; coutПолями структур могут быть произвольные типы данных. Можно, например, создать структуру, полями которой будут массивы или другие структуры.
Например, пусть мы хотим определить структуру Circle для определения окружности. Окружность задается центром и радиусом. Радиус – это действительное число (поле Radius типа double ), а центр – это, конечно же, точка, то есть поле Center имеет тип Point . Получили:
struct Circle < Point Center; double Radius; >;Дальше с такими "вложенными" структурами можно работать так:
Circle A; A.Radius = 10; A.Center.x = -3; A.Center.y = 15;Структура (программирование)
Структура — конструкция большинства языков программирования, позволяющая содержать в себе набор переменных различных типов. В языках семейства Pascal структуры традиционно называют записями (англ. record ).
С внедрением концепции объектно-ориентированного программирования понятие структуры было расширено, в частности была добавлена возможность включения в структуру функций-методов, появились ключевые слова для ограничения доступа к элементам структуры. В результате структура стала очень похожа на классы и интерфейсы, однако в большинстве языков сохранила некоторые отличия от них.
Пример объявления структуры
Си
struct str_name int member_1; float member_2; char member_3[256]; /* . */ >; // примеры инициализации структуры. struct str_name struct0; struct str_name struct1 = 1, 3.1416, "doit" /* . */>; struct str_name struct2 = member_1:2, member_2:3.1416, member_3:"doit" /* . */>; struct str_name struct2 = .member_1=2, .member_2=3.1416, .member_3="doit" /* . */>;C++
struct str_name private: int member_1; float member_2; public: std::string member_3; // . >; // примеры инициализации структуры. str_name struct0; str_name struct1 = 1, 3.1416, "doit" /* . */>; str_name struct2 = member_1:2, member_2:3.1416, member_3:"doit" /* . */>; str_name struct2 = .member_1=2, .member_2=3.1416, .member_3="doit" /* . */>;C#
struct str_name private int member_1; private float member_2; public string member_3; // . >;Pascal
type str_name = record begin public: member_1 : integer; member_2 : extended; private: member_3 : string; end;Отличия от классов
Отличия классов от структур в разных языках разнится. Отличия для языка С#:
- Размещение: в области стека (классы — управляемая куча (heap)
- Копирование: создаётся отдельная копия объекта, которая после копирования живёт «своей жизнью» (классы — создаётся ссылка на тот же класс (т. н. instance)
- Наследование: не разрешается дополнение своими свойствами; от него нельзя наследовать (класс — позволяет, кроме случаев когда класс создавался с ключевым словом sealed, не разрешающим наследование)
- Передача параметров: как локальные копии переменных (в классах — как ссылки)
- Конструктор: да, кроме конструктора по умолчанию, который не требует параметров (в классах — да, без ограничений)
- Освобождение переменной: при выходе за пределы видимости (в классах — во время процесса сборки мусора (garbage collector)
Отличия для языка C++:
- Члены структуры по умолчанию (без явного указания спецификатора доступа) являются публичными, а члены класса - закрытыми
Логический • Низший тип • Коллекция • Перечисляемый тип • Исключение • First-class function • Opaque data type • Recursive data type • Семафор • Поток • Высший тип • Type class • Unit type • Void
Абстрактный тип данных • Структура данных • Интерфейс • Kind (type theory) • Примитивный тип • Subtyping • Шаблоны C++ • Конструктор типа • Parametric polymorphism
- Типы данных
Wikimedia Foundation . 2010 .
- Струковский сад
- Структура данных для непересекающихся множеств
Полезное
Смотреть что такое "Структура (программирование)" в других словарях:
- Программирование — процесс составления упорядоченной последовательности действий (программы (См. Программа)) для ЭВМ; научная дисциплина, изучающая программы для ЭВМ и способы их составления, проверки и улучшения. Каждая ЭВМ является автоматом,… … Большая советская энциклопедия
- ПРОГРАММИРОВАНИЕ ТЕОРЕТИЧЕСКОЕ — математическая дисциплина, изучающая математич. абстракции программ, трактуемых как объекты, выраженные на формальном языке, обладающие определенной информационной и логич. структурой и подлежащие исполнению на автоматич. устройствах. П. т.… … Математическая энциклопедия
- СТРУКТУРА ИССЛЕДОВАНИЯ: — деятельностная: мотивы – цели – задачи – содержание – формы – методы – критерии – результаты; управленческая: первичный анализ – прогнозирование – программирование – планирование – организация – регулирование – контроль – анализ – корригирование… … Современный образовательный процесс: основные понятия и термины
- Класс (программирование) — У этого термина существуют и другие значения, см. Класс. Класс в программировании набор методов и функций. Другие абстрактные типы данных метаклассы, интерфейсы, структуры, перечисления характеризуются какими то своими, другими… … Википедия
- Нейро-лингвистическое программирование — Нейролингвистическое программирование (НЛП) (англ. Neuro linguistic programming) (также встречается вариант «нейро лингвистическое программирование») комплекс моделей, техник и операционных принципов (контекстуально зависимых убеждений),… … Википедия
- Ретроспектива в программирование — Разработка программного обеспечения Процесс разработки ПО Шаги процесса Анализ • Проектирование • Реализация • Тестирование • … Википедия
- Структурное программирование — Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью в соответствии с правилами написания статей … Википедия
- Неструктурированное программирование — Структурное программирование методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 70 х годах XX века Э. Дейкстрой, разработана и дополнена Н. Виртом. В … Википедия
- Нейролингвистическое программирование: Библиография — Одна из статей на тему Нейролингвистическое программирование (НЛП) Основные статьи НЛП · Принципы · НЛП психотерапия · История Новый код · НЛП и наука · Библиография · Словарь Принципы и методы Моделирование · Метамодель · Милтон модель Позиции… … Википедия
- Парадигма (программирование) — Парадигма программирования это совокупность идей и понятий, определяющая стиль написания программ. Парадигма, в первую очередь, определяется базовой программной единицей и самим принципом достижения модульности программы. В качестве этой единицы … Википедия
- Обратная связь: Техподдержка, Реклама на сайте
- Путешествия
Экспорт словарей на сайты, сделанные на PHP,
WordPress, MODx.
- Пометить текст и поделитьсяИскать в этом же словареИскать синонимы
- Искать во всех словарях
- Искать в переводах
- Искать в ИнтернетеИскать в этой же категории
Структуры
Структура - это совокупность переменных, объединенных одним именем, предоставляющая общепринятый способ совместного хранения информации. Объявление структуры приводит к образованию шаблона, используемого для создания объектов структуры. Переменные, образующие структуру, называются членами структуры. (Члены структуры также часто называются элементами или полями.)
Обычно все члены структуры связаны друг с другом. Например, информация об имени и адресе, находящаяся в списке рассылки, обычно представляется в виде структуры. Следующий фрагмент кода объявляет шаблон структуры, определяющий имя и адрес. Ключевое слово struct сообщает компилятору об объявлении структуры.
struct addr char name[30];
char street [40]; char city[20];
char state[3];
unsigned long int zip;
>;
Объявление завершается точкой с запятой, поскольку объявление структуры - это оператор. Имя структуры addr идентифицирует структуру данных и является спецификатором типа. Имя структуры часто используют как ярлык.
На данный момент на самом деле не создано никакой переменной. Определена только форма данных. Для объявления настоящей переменной, соответствующей данной структуре, следует написать:
struct addr addr_info;
В данной строке происходит объявление переменной addr_info типа addr. При объявлении структуры определяется переменная смешанного типа. До тех пор, пока не будет объявлена переменная данного типа, она не будет существовать.
Когда объявлена структурная переменная, компилятор автоматически выделяет необходимый участок памяти для размещения всех ее членов. Рис. показывает размещение addr_info в памяти.
Структуры
Структура в языке программирования Си представляет собой составной тип данных, который состоит из других компонентов. При этом в отличие от массива эти компоненты могут представлять различные типы данных.
Определение структуры
Для определения структуры применяется ключевое слово struct , а сам формат определения выглядит следующим образом:
struct имя_структуры < компоненты_структуры >;
Имя_структуры представляет произвольный идентификатор, к которому применяются те же правила, что и при наименовании переменных.
После имени структуры в фигурных скобках помещаются компоненты структуры - объекты, которые составляют структуру.
Следует отметить, что в отличие от функции при определении структуры после закрывающей фигурной скобки идет точка с запятой.
Например, определим простейшую структуру:
struct person < int age; char * name; >;
Здесь определена структура person , которая имеет два элемента: age (представляет тип int ) и name (представляет указатель на тип char ).
Все элементы структуры объявляются как обычные переменные. Но в отличие от переменных при определении элементов структуры для них не выделяется память, и их нельзя инициализировать. По сути мы просто определяем новый тип данных.
Использование структуры
После определения структуры мы можем ее использовать. Для начала мы можем определить объект структуры - по сути обычную переменную, которая будет представлять выше созданный тип:
// определение структуры person struct person < int age; char * name; >; int main(void) < // определение переменной, которая представляет структуру person struct person tom; >
Здесь определена переменная tom, которая представляет структуру person . И при каждом определении переменной типа структуры ей будет выделяться память, необходимая для хранения ее элементов.
Инициализация структуры
При определении переменной структуры ее можно сразу инициализировать, присвоив какое-нибудь значение. Инициализация структур аналогична инициализации массивов: в фигурных скобках передаются значения для элементов структуры. Есть два способа инициализации структуры.
-
По позиции : значения передаются элементам структуры в том порядке, в котором они следуют в структуре:
struct person tom = ;
struct person tom = ;
Обращение к элементам структуры
Также после создания переменной структуры можно обращаться к ее элементам - получать их значения или, наоборот, присваивать им новые значения. Для обращения к элементам структуры используется операция "точка":
имя_переменной_структуры.имя_элемента
Теперь объединим все вместе в рамках программы:
#include struct person < int age; char * name; >; int main(void) < struct person tom = ; printf("Age: %d \t Name: %s", tom.age, tom.name); return 0; >
Консольный вывод программы:
Age: 23 Name: Tom
Можно инициализировать элементы структуры по отдельности:
#include struct person < int age; char * name; >; int main(void)
Объединение определение структуры и ее переменных.
Мы можем одновременно совмещать определение типа структуры и ее переменных:
#include struct person < int age; char * name; >tom; // определение структуры и ее переменной int main(void) < tom = ; printf("Name:%s \t Age: %d", tom.name, tom.age); return 0; >
После определения структуры, но до точки с запятой мы можем указать переменные этой структуры. А затем присвоить их элементам значения.
Можно тут же инициализировать структуру:
#include struct person < int age; char * name; >tom = ; int main(void)
Можно определить сразу несколько переменных:
struct person < int age; char * name; >tom, bob, alice;
При подобном определении мы можем даже не указывать имя структуры:
struct < int age; char * name; >tom;
В этом случае компилятор все равно будет знать, что переменная tom представляет структуры с двумя элементами name и age. И соответственно мы также с этими переменными сможем работать. Другое дело, что мы не сможем задать новые переменные этой структуры в других местах программы.
typedef
Еще один способ определения структуры представляет ключевое слово typedef :
#include typedef struct < int age; char * name; >person; int main(void) < person tom = ; printf("Name:%s \t Age: %d", tom.name, tom.age); return 0; >
В конце определения структуры после закрывающей фигурной скобки идет ее обозначение - в данном случае person . В дальнейшем мы можем использовать это обозначение для создания переменной структуры. При этом в отличие от примеров выше здесь при определении переменной не надо использовать слово struct .
Директива define
Еще один способ определить структуру представляет применение препроцессорной директивы #define :
#include #define PERSON struct int main(void) < PERSON tom = ; printf("Name:%s \t Age: %d", tom.name, tom.age); return 0; >
В данном случае директива define определяет константу PERSON, вместо которой при обработке исходного кода препроцессором будет вставляться код структуры struct
Копирование структур
Одну структуру можно присвавивать другой структуре того же типа. При копировании элементы структуры получают копии значений:
#include struct person < int age; char * name; >; int main(void) < struct person tom = ; // копируем значения из структуры tom в структуру bob struct person bob = tom; bob.name = "Bob"; printf("Name: %s \t Age: %d \n", bob.name, bob.age); printf("Name: %s \t Age: %d \n", tom.name, tom.age); return 0; >
Здесь в переменную bob копируются данные из структуры tom . Далее мы для структуры bob меняется значение поля name . В итоге мы получим следующий консольный вывод:
Name: Bob Age: 38 Name: Tom Age: 38
Ввод с консоли данных для структуры
С элементами структуры можно производить все те же операции, что и с переменными тех же типов. Например, добавим ввод с консоли:
#include struct person < int age; char name[20]; >; int main(void) < struct person tom = ; printf("Enter name: "); scanf("%s", tom.name); printf("Enter age: "); scanf("%d", &tom.age); printf("Name:%s \t Age: %d", tom.name, tom.age); return 0; >
Консольный вывод программы:
Enter name: Eugene Enter age: 33 Name: Eugene Age: 33