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

10.1.5. Присвоєння структур

Вміст однієї структури можна присвоїти інший, якщо обидві ці структури мають однаковий тип. Наприклад, наведений нижче код програми присвоює значення структурної змінної strVar1 змінній strVar2.

Код програми 10.2. Демонстрація можливості присвоєння значень структурним змінним

#include <vcl>

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

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

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

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

int a, b;

};

int main()

{

demoStruct strVar1, strVar2;

strVar1.a = strVar1.b = 10;

strVar2.a = strVar2.b = 20;

cout << "Структури до присвоєння.\n";

cout << "strVar1: " << strVar1.a << " " << strVar1.b << "\n";

cout << "strVar2: " << strVar2.a << " " << strVar2.b << "\n\n";

strVar2 = strVar1; // Присвоєння структур

cout << "Структури після присвоєння.\n";

cout << "strVar1: " << strVar1.a << " " << strVar1.b << "\n";

cout << "strVar2: " << strVar2.a << " " << strVar2.b << "\n";

getch(); return 0;

}

Внаслідок виконання цієї програми на моніторі буде відображено такі результати:

Структури до присвоєння.

strVar1: 10 10

strVar2: 20 20

Структури після присвоєння.

strVar1: 10 10

strVar2: 10 10

У мові програмування C++ кожне нове оголошення структури визначає новий тип. Отже, навіть якщо дві структури фізично однакові, але мають різні імена типів, компілятор вважатиме їх різними і не дасть змоги присвоїти значення однієї з них інший. Розглянемо такий фрагмент коду програми. Він некоректний і тому не скомпілюється:

struct demoStructA {

int a, b;

};

struct demoStructB {

int a, b;

};

int main()

{

demoStructA strVar1;

demoStructB strVar2;

strVar2 = strVar1; // Помилка через невідповідності типів.

. . . . .

}

Незважаючи на те, що структури demoStructA і demoStructB фізично однакові, з погляду компілятора вони є окремими типами.

Необхідно пам'ятати! Одну структуру змінну можна присвоїти іншій тільки у тому випадку, якщо обидві вони мають однаковий тип.

10.1.6. Передача структури функції як аргументу

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

Використовуючи структуру як параметр, необхідно також пам'ятати, що тип аргументу повинен відповідати типу параметра. Наприклад, у наведеному нижче коді програми спочатку оголошується структура demoStruct, а потім функція fun_a() приймає параметр типу demoStruct.

Код програми 10.3. Демонстрація механізму передачі структури функції як аргументу

#include <vcl>

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

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

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

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

int a;

char ch;

};

void fun_a(demoStruct pm); // Оголошення прототипу функції

int main()

{

demoStruct arg; // Визначення змінної arg типу demoStruct.

arg.a = 1000;

arg.ch = 'x';

fun_a(arg); // Передача структури функції як аргументу

getch(); return 0;

}

void fun_a(demoStruct pm) // Визначення функції

{

cout << "Передана функції структура: "

<< "a= " << pm.a << "; ch= " << pm.ch << "\n";

}

Внаслідок виконання цієї програми на моніторі буде відображено такий результат:

Передана функції структура: a= 1000; ch= x

У цій програмі як аргумент arg у функції main(), так і параметр pm у функції fun_a() мають однаковий тип. Тому аргумент arg можна передати функції fun_a(). Якби типи цих структур були різні, у процесі компілювання коду програми було б видано повідомлення про помилку.