Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Технологии разработки ПО 2005.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
833.54 Кб
Скачать

Структуры

В языке С++ структура является видом класса и обладает всеми его свойствами. Как правило, описание структуры определяет новый (абстрактный) тип данных, имя которого можно использовать в дальнейшем наряду со стандартными типами. Структуры предназначены для объединения некоторого количества переменных стандартных типов. В структуру, в противоположность массиву, можно объединять данные различных типов. Синтаксис структуры фактически идентичен синтаксису класса. Только структуры, как правило, используют в качестве объединения данных, а классы – в качестве объединения данных и функций.

Рассмотрим структуру, содержащую три поля и предназначенную для хранения информации о товарах, хранящихся на складе.

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; .

Структуры и функции

Использование структурных переменных с функциями подчиняется правилам для обычных переменных стандартных типов. Структурные переменные можно передавать в функцию по значению, по ссылке или по указателю. Также допускается использование структурной переменной в качестве возвращаемого значения. При разделении логически законченных действий программы на функции, надо иметь в виду, что структура, в отличие от массива, может быть возвращаемым значением функции. Структура может передаваться в функцию по константной ссылке, а также и по значению, что несколько хуже, потому что в этом случае затрачивается время на копирование и требуется дополнительное место в стеке параметров.