Структуры. Часть 1. Составные типы данных. Шаблон структуры. Структурная переменная. Структуры в среде CLR. Объявление и инициализация структурной переменной

Структуры. Часть 1. Составные типы данных. Шаблон структуры. Структурная переменная. Структуры в среде CLR. Объявление и инициализация структурной переменной


Содержание


1. Какое отличие между базовыми и составными типами данных?

Все типы данных в C++ делятся на:

Переменные базовых типов данных состоят из одного элемента данных. Переменные составных типов данных содержат два и больше элемента данных.

2. Какие типы данных в C++ принадлежат к составным или агрегатным типам данных?

Составные типы данных еще называют агрегатными или конгломератными типами данных.

К составным или агрегатным типам данных принадлежат:

  • массивы;
  • структуры;
  • объединения;
  • перечисления (enumeration);
  • классы.

3. Что называется структурой в C++? Что называется полем структурной переменной?

Структура – это объединения одной или больше переменных в одной области памяти, которая имеет одно имя.

Структура – это объединение (группирование) переменных, которые родственны между собою по некоторому критерию.

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



4. Каким образом классифицируются структуры в среде CLR? Native-структуры. Managed-структуры

Среда CLR поддерживает объявление структур двух видов:

  • native-структуры;
  • managed-структуры или управляемые структуры.

Native-структуры – это классические структуры языка C/C++.

Managed-структуры – это структуры, которые размещаются в памяти, которая выделяется и управляется средой CLR.

Managed-структуры могут быть объявлены с одним из двух квалификаторов:

  • квалификатор ref – означает, что структура есть ссылочного типа;
  • квалификатор value – означает, что структура есть типом-значением.

Отличие между квалификаторами ref и value состоит в способе выделения памяти для указателя на структуру. Более подробно работа с указателями на managed-структуры описана здесь.

5. Какая общая форма объявления native-структуры (шаблона структуры)?

Для объявления native-структуры (или шаблона структуры) используется ключевое слово struct. Общая форма объявления структуры:

struct имя_типа_структуры
{
    тип элемент_1;
    тип элемент_2;
    ...
    тип элемент_N;
} структурные_переменные;

где

  • имя_типа_структуры – название шаблона структуры. Шаблон структуры описывает новый тип данных, который может быть использован в дальнейшем в программе на C++;
  • тип – тип данных, которые имеются в наличии на данный момент в программе;
  • элемент1, элемент2, …, элементN – названия элементов (переменных), входящих в структуру. Элементы структуры еще называются полями структуры;
  • структурные_переменные – это переменные, которые есть структурами. В случае объявления шаблона структуры структурные_переменные могут отсутствовать (смотрите следующие пункты).

6. Какая общая форма объявления managed-структуры с квалификаторами ref и value?

Общая форма объявления структуры (шаблона структуры) с квалификатором ref:

ref struct имя_типа_структуры
{
    тип элемент_1;
    тип элемент_2;
    ...
    тип элемент_N;
} структурные_переменные;

Общая форма объявления структуры (шаблона структуры) с квалификатором value:

value struct имя_типа_структуры
{
    тип элемент_1;
    тип элемент_2;
    ...
    тип элемент_N;
} структурные_переменные;

В вышеприведенных описаниях:

  • имя_типа_структуры – название шаблона структуры. Шаблон структуры образовывает новый тип данных, который может быть использован в дальнейшем в программе;
  • тип – тип данных, имеющихся на данный момент в программе;
  • элемент1, элемент2, …, элементN – названия элементов (переменных), входящих в структуру. Элементы структуры еще называются полями структуры;
  • структурные_переменные – это переменные, которые есть структурами. В случае объявления шаблона структуры структурные_переменные могут отстствовать.

Более подробно работа с managed-структурами описана в теме:

7. Что такое шаблон (формат) структуры? Примеры задания шаблона

Чтобы описать структурную переменную, нужно сначала задать шаблон структуры. Шаблон структуры еще называется формат структуры. При задании шаблона структуры память не выделяется. Шаблон – это только описание (информация), переменные каких типов должны входить в структуру.

Пример 1. Описание шаблона структуры, которая описывает информацию об отработанных часах работником.

Шаблон содержит следующую информацию:

  • код работника;
  • фамилия и имя работника;
  • количество отработанных часов;
  • расценка за 1 час.
// информация о работнике
// шаблон структуры
struct Worker
{
    int code;   // код работника
    char name[50]; // имя работника
    int hours; // количество отработанных часов
    float cost; // расценка за 1 час
};

В данном примере шаблон называется Worker. В шаблоне описываются следующие поля (переменные):

  • code – код работника;
  • name – имя работника;
  • hours – количество отработанных часов;
  • cost – расценка за 1 час.

Пример 2. Объявление шаблона с именем Laboratory, содержащего информацию о лаборатории в учебном заведении:

  • номер лаборатории;
  • название лаборатории;
  • площадь лаборатории;
  • количество посадочных мест.
// информация о лаборатории
// шаблон структуры
struct Laboratory
{
    int   number;
    char name;
    float area;
    int   places;
};

Для managed-структур перед словом struct указывается квалификатора ref или value.

8. Что такое структурная переменная? Способы объявления структурных переменных. Доступ к полям структурной переменной

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

Структурную переменную можно объявить несколькими способами:

  • на основе шаблона, который был объявлен раньше;
  • во время объявления шаблона;
  • с помощью квалификатора typedef.

Ниже приведены все 3 способы объявления структурной переменной, которая базируется на основе шаблона Worker, описывающего информацию о работнике. Рассмотрен пример для native-структуры.

// информация о работнике
// шаблон native-структуры
struct Worker
{
    int code;   // код работника
    char name[50]; // имя работника
    int hours; // количество отработанных часов
    float cost; // расценка за 1 час
};

Тогда структурную переменную можна описать следующими способами.

Способ 1. Описание переменной на основе ранее заданного шаблона Worker. В этом случае сначала задается шаблон структуры, затем описывается переменная (экземпляр структуры).

// Способ 1. Описание переменной по ранее созданному шаблону
Worker w; // для переменной w выделяется память

// заполнение полей переменной
w.code = 334;
strcpy(w.name, "Johnson B.");
w.hours = 23;
w.cost = 12.85f;

В вышеприведенном примере объявляется переменная с именем w на основе ранее описанного шаблона Worker. Затем для примера заполняются поля структурной переменной.

Способ 2. Объявление переменной во время задания шаблона. В этом способе объединяется объявление шаблона структуры и создание экземпляра структуры (переменной).

// Способ 2. Объявление переменной w1 во время объявления шаблона
struct Worker
{
    int code;
    char name[50];
    int hours;
    float cost;
} w1;

Доступ к полям переменной w1 из другого прогаммного кода

// заполнение значениями полей переменной w1
w1.code = 123;
strcpy(w1.name, "Williams D.");
w1.hours = 33;
w1.cost = 10.58f;

Способ 3. Объявление переменной на основе типа, созданного с помощью квалификатора typedef.

Пусть в некоторой части программы объявлен новый тип WORKER, который основан на структуре Wrk, содержащей информацию о работнике:

// ключевое слово typedef
// объявление нового типа WORKER
typedef struct Wrk
{
    int code;
    char name[50];
    int hours;
    float cost;
} WORKER;

Тогда, чтобы использовать переменную с именем w2 типа WORKER, нужно написать следующий код:

// объявление переменной на основе типа,
// заданного с помощью ключевого слова typedef
WORKER w2;

w2.code = 100;
strcpy(w2.name, "Typedef");
w2.hours = 33;
w2.cost = 21.33f;

В этом способе задавать имя шаблона структуры Wrk необязательно. То есть, следующая запись также есть корректной

// после слова struct название шаблона отсутствует
typedef struct
{
    int code;
    char name[50];
    int hours;
    float cost;
} WORKER;

9. Где можно задавать шаблон структуры в среде CLR?

В среде CLR рекомендуется объявлять шаблон структуры или новый тип на базе структуры (средство typedef) в отдельном «*.h» файле, например «MyStruct.h». Тогда удобно подключать эту структуру в другие модули программы, например:

#include "MyStruct.h"

10. Как осуществляется инициализация структурной переменной при ее объявлении? Пример инициализации native-структурной переменной

Пусть задан шаблон структуры Worker

// шаблон native-структуры
struct Worker
{
    int code;   // код работника
    char name[50]; // имя работника
    int hours; // количество отработанных часов
    float cost; // расценка за 1 час
};

Тогда инициализация структурной переменной может быть такой.

Способ 1. Объявление и инициализация переменной после того, как раньше был задан шаблон структуры Worker

Worker w = {
             150,
             "Andrews",
             45,
             18.45f
           };

int d;
d = w.code; // d = 150
float f;
f = w.cost; // f = 18.45

Способ 2. Объединение задания шаблона, описания структурной переменной и ее инициализации.

// шаблон структуры
struct Worker
{
    int code;   // код работника
    char name[50]; // имя работника
    int hours; // количество отработанных часов
    float cost; // расценка за 1 час
} w1 = {
         200,
         "Armstrong W.",
         64,
         22.34f
       };

...

int d;
float f;
d = w1.code; // d = 200
f = w1.cost; // f = 22.34

Способ 3. Если задан тип с помощью квалификатора typedef, тогда инициализация структурной переменной будет следующей

// объявление нового типа WORKER
typedef struct
{
    int code;   // код работника
    char name[50]; // имя работника
    int hours; // количество отработанных часов
    float cost; // расценка за 1 час
} WORKER;

...

WORKER W =
{
    333,
    "Baxter N.",
    34,
    15.30f
};

int d;
float f;

d = W.code; // d = 333
f = W.cost; // f = 15.30f


Связанные темы