Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

10.3. Посилання на структури

Для доступу до структури можна використовувати посилання. Посилання на структуру часто використовують як параметр функції або значення, що повертається функцією. Під час отримання доступу до членів структури за допомогою посилання використовують оператор "крапка"1.

10.3.1. Використання структур під час передачі функції параметрів за посиланням

У наведеному нижче коді програми показано, як можна використовувати структуру під час передачі функції параметрів за посиланням.

Код програми 10.7. Демонстрація механізму використання посилання на структуру

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

struct myStruct { // Оголошення типу структури

int a;

int b;

};

// Оголошення прототипу функції,

// яка отримує і повертає посилання на структуру

myStruct &fun_2(myStruct &var);

int main()

{

myStruct X_st, Y_st;

X_st.a = 10; X_st.b = 20;

cout << "Початкові значення полів : X_st.a= "

<< X_st.a << "; X_st.b= " << X_st.b << "\n";

Y_st = fun_2(X_st);

cout << "Модифіковані значення полів: X_st.a= "

<< X_st.a << "; X_st.b= " << X_st.b << "\n";

cout << "Модифіковані значення полів: Y_st.a= "

<< Y_st.a << "; Y_st.b= " << Y_st.b << "\n";

getch(); return 0;

}

// Визначення Функції, яка отримує і повертає посилання на структуру

myStruct &fun_2(myStruct &var)

{

var.a = var.a * var.a;

var.b = var.b / var.b;

return var;

}

Ось результати виконання цієї програми.

Початкові значення полів: X_st.а= 10; X_st.b= 20

Модифіковані значення полів: X_st.а= 100; X_st.b= 1

Модифіковані значення полів: Y_st.а= 100; Y_st.b= 1

Зважаючи на істотні витрати системних ресурсів, що використовуються на передачу структури функції (або під час повернення її функцією) багато С++-програмістів для виконання таких завдань використовують посилання на структури.

10.3.2. Використання як членів структур масивів і структур

Кожен член структури може мати будь-який допустимий тип даних, y тому числі і такі складені типи, як масиви й інші структури. Оскільки ця тема пов'язана з певними труднощами для програмістів, то зупинимося на ній детальніше.

Масив, що використовується як член структури, обробляється цілком звичайним способом. Розглянемо таку структуру:

struct demoStruct { // Оголошення типу структури

int tMas[10][10]; // Цілочисельний масив розміром 10х10.

float b;

} var; // Визначення структурної змінної

Щоб присвоїти певне значення елементу масиву tMas з "координатами" 37 в структурі var типу demoStruct, необхідно записати таку настанову:

var.tMas[3][7] = 2.37;

Як показано у цьому прикладі, якщо масив є членом структури, то для доступу до елементів цього масиву індексується ім'я масиву, а не ім'я структури.

Якщо певна структура є членом іншої структури, то вона називається вкладеною структурою. У наведеному нижче прикладі структура addrStruct вкладена у структуру empStruct:

struct addrStruct { // Оголошення адреси структури

char nazva[40]; // Прізвище службовця

char street[40]; // Вулиця

char city[40]; // Місто

char zip[10]; // Поштовий індекс

};

struct empStruct { // Оголошення реквізитів структури

addrStruct address; // Адреса службовця

float wage; // Оклад службовця

} worker;

Тут структура empStruct має два члени. Першим членом є структура типу addrStruct, яка міститиме адресу службовця. Другим членом є змінна wage, яка зберігає його оклад. У процесі виконання наведеної нижче настанови полю zip структури address, яка є членом структури worker, буде присвоєно поштовий індекс 76285:

worker.address.zip = 76285;

Як бачимо, члени структур вказуються зліва направо, – від крайньої зовнішньої до найдальшої внутрішньої.

Структура також може містити як свій член покажчик на цю ж структуру. Тобто для структури цілком допустимо містити член, який є покажчиком на неї саму. Наприклад, в такій структурі змінна sptr оголошується як покажчик на структуру типу myStruct, тобто на оголошувану тут структуру:

struct myStruct { // Оголошення типу структури

int a;

char str[80];

myStruct *sptr; // Покажчик на структуру типу myStruct

};

Структури, що містять покажчики на самих себе, часто використовують під час створення таких структур даних, як зв'язні списки. У міру вивчення мови C++ Вам обов'язково потраплять програмні коди, у яких застосовуються подібні речі.

10.3.3. Порівняння С- і С++-структур

С++-структури – нащадки С-структур. Отже, будь-яка С-структура також є дійсною С++-структурою. Між ними, проте, існують важливі відмінності:

  • по-перше, як буде показано в наступному розділі, С++-структури мають деякі унікальні атрибути, які дають змогу їм підтримувати об'єктно-орієнтоване програмування;

  • по-друге, у мові С структура не оголошує насправді новий тип даних. Цим може "похвалитися" тільки С++-структура.

Як було сказано вище, оголошуючи структуру у мові програмування C++, оголошуємо новий тип, який називається за іменем цієї структури. Цей новий тип можна використовувати для визначення змінних, визначення значень, що повертаються функціями, і т.ін. Проте у мові С ім'я структури називається її тегом (або дескриптором). А тег сам по собі не є іменем типу.

Щоб зрозуміти цю відмінність, розглянемо такий фрагмент С-коду:

struct cStruct {

int a;

int b;

};

// Оголошення змінної cStruct

struct cStruct strVar;

Звернемо Вашу увагу на те, що наведене вище оголошення структури точно таке ж саме, як у мові C++. Тепер уважно розглянемо визначення структурної змінної strVar. Воно також починається з ключового слова struct. У мові С після оголошення структури для повного задавання типу даних все одно потрібно використовувати ключове слово struct спільно з тегом| цієї структури (у цьому випадку з ідентифікатором cStruct).

Якщо Вам доведеться перетворювати старі С-програми у код програми мовою C++, не варто турбуватися про відмінності між С- і С++-структурами, оскільки мова C++, як і раніше, приймає С-орієнтовані оголошення. Наприклад, попередній фрагмент С-коду програми коректно скомпілюється як частина будь-якої С++-програми. З погляду компілятора мови C++ у визначенні змінної strVar зайвим використано тільки ключове слово struct, без якого мова C++ може обійтися.