Різниця між структурою та союзом

Автор: Laura McKinney
Дата Створення: 1 Квітень 2021
Дата Оновлення: 14 Травень 2024
Anonim
Придаточные предложения цели в немецком языке. Damit или um...zu ?
Відеоролик: Придаточные предложения цели в немецком языке. Damit или um...zu ?

Зміст


C ++ дозволяє використовувати всі п’ять способів, якими надається мова С для створення користувацьких даних. Ці п'ять способів - це "структура", "бітове поле", "об'єднання", "перерахування", "typedef". У статті нижче ми будемо вивчати різницю між структурою та об'єднанням. І структура, і об'єднання - це типи даних контейнерів, які можуть зберігати дані будь-якого "типу". Основна відмінність, яка відрізняє структуру та об'єднання, полягає в тому, що структура має окреме місце пам’яті для кожного зі своїх членів, тоді як члени об'єднання мають одне і те ж місце пам’яті.

Давайте розберемось у різниці між структурою та об'єднанням разом із порівняльною діаграмою.

  1. Порівняльна діаграма
  2. Визначення
  3. Ключові відмінності
  4. Схожість
  5. Висновок

Порівняльна діаграма

Основи порівнянняБудоваСоюз
ОсновніОкреме місце пам'яті відводиться кожному члену структури.Усі члени спілки мають одне і те саме місце пам’яті.
Деклараціяstruct struct_name {
тип елемента1;
тип елемента2;
.
.
} змінний1, змінний2, ...;
союз u_name {
тип елемента1;
тип елемента2;
.
.
} змінний1, змінний2, ...;
ключове словоструктурасоюз
РозмірРозмір структури = сума розміру всіх членів даних.Розмір Союзу = розмір найбільших членів.
Цінність магазинуЗберігає чіткі значення для всіх членів.Зберігає однакове значення для всіх членів.
ЗаразСтруктура зберігає в структурі кілька значень різних членів.Профспілка одночасно зберігає єдине значення для всіх членів.
Спосіб переглядуНадайте єдиний спосіб перегляду кожного місця в пам'яті.Надайте кілька способів перегляду одного і того ж місця в пам'яті.
Анонімна функціяБез анонімних функцій.Анонімний союз може бути оголошений.

Визначення структури

Структура - це сукупність змінних різних типів даних, які посилаються загальною назвою. Змінні в структурі називаються "членами". За замовчуванням всі члени структури є "загальнодоступними". Коли ви декларуєте структуру, ви створюєте шаблон, який можна використовувати для створення об’єктів структури, обмінюючись однаковою організацією членів даних та функцій членів. Оголошенню структури завжди передує ключове слово "struct", яке повідомляє компілятору, що було оголошено структуру. Візьмемо приклад.


Візьмемо приклад.

Співробітник структури {ім'я рядка; string company_name; місто струни; } emp1, emp2;

Тут ми оголошуємо структуру для зберігання інформації працівників. Оголошення закінчується крапкою з комою, як оголошення декларації - це твердження, а в C ++ заява закінчується крапкою з комою.

Ім'я, яке надається структурі, визначає "тип" (у наведеному вище прикладі назва структури - "співробітник"). Змінні цих типів можуть бути створені, як зазначено вище, ми створили дві змінної 'emp1' і 'emp2' типу «співробітник». У наведеному вище прикладі ми створили змінну "структура" відразу після оголошення; по черзі, це може бути створено окремо.

структура працівника emp1, emp2; // структура ключових слів не є обов'язковою.

Члени змінної структури можна ініціалізувати або отримати доступ до них за допомогою оператора dot (.).

emp1.name = "ashok";

Інформація, що міститься в одній змінній структури, може бути віднесена до іншої змінної структури того ж типу, що й далі.


emp1.name = "ashok"; emp1.company_name = "Teckpix"; emp1.city = "Делі"; emp2 = emp1; // присвоєння значень члена emp1 до emp2. cout <

Тут ми призначили змінну структури 'emp1' 'на' emp2 ', тому' emp1 'копіює все значення своїх членів у відповідний член' epm2 '.

Член змінної структури може бути переданий функції.

функція (emp1.city);

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

funt (emp1); // функція виклику за допомогою виклику методом значення. . . void funct (структура працівника emp) {// отримання значень членів emp1. cout <

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

funt (& emp1); // функція виклику за допомогою виклику методом довідки. . . void funct (структура працівника * emp) {// адреса прийому emp1. emp-> city = "Нур"; // змінити значення члена (міста) змінної структури emp1. . }

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

srtuct співробітник * emp; // відмінювання структурного покажчика типу співробітника. emp = & emp1; // присвоєння покажчика адреси emp1. emp-> city // покажчик доступу до міста-члена emp1.

Вказівник на структуру також може бути створений; він містить адресу змінної структури.

У структурі ініціалізація сукупності дозволена, коли визначення структури не містить будь-якого визначеного користувачем конструктора або віртуальних функцій або базового класу або приватного або захищеного поля.

int main () {struct epm3 = {"Anil", "Teckpix", "Nur"}; } // Можливо, оскільки структура працівника не містить жодної з вищезгаданих речей.

Визначення Союзу

Союз - це місце пам'яті, яке поділяється двома або більше різними типами змінних, оголошених під одним типом об'єднання. Ключове слово, яке використовується для декларування союзу, - «союз». У C ++ об'єднання може містити як функцію-члена, так і змінні. За замовчуванням всі члени профспілки є "громадськими". Декларація "союзу" подібна до декларації структури.

об'єднання u_type {int x, char c; float f; } u1, u2;

Тут ми оголосили об'єднання під назвою u_type. Члени u_type - це «x» цілого типу, «c» типу символів та «f» типу float. Ми також створили змінні об'єднання "u1" і "u2", типу "u_type", відразу після декларування об'єднання. Ми також можемо оголосити змінну об'єднання окремо від декларації об'єднання.

int main () {об'єднання u_type u1, u2; // Союз ключових слів не є обов'язковим для C ++. }

Доступ до членів об'єднання може бути здійснено за допомогою оператора dot (.), Який передує змінній об'єднання і слідкує за членом цієї змінної.

u1.x = 10;

Як і структури, сукупність ініціалізації в об'єднанні неможлива. Як нам відомо, об'єднання поділяє однакове місце пам'яті для всіх своїх членів одночасно, ініціалізується лише одна змінна, і вся змінна автоматично оновлюється ініціалізованим значенням.

u1.x = 10; cout <

Якщо ви спробуєте змінити значення будь-якого учасника "u1". Інший член буде автоматично оновлений до цього значення.

u1.c = 65; cout <

Простір, відведений союзу, дорівнює розміру найбільшого члена союзу. Оскільки байт, призначений для "char", становить 1 байт, "int" - 4 байти, а "float" - 4 байти, то найбільший розмір - 4 байти. Отже, пам'ять, відведена на "u1" і "u2", становить 4 байти.

int main () {int size_1 = sizeof (u1); // 4 int size_2 = sizeof (u2); // 4

Вказівник на союз може бути створений так само, як за структурою. Вказівник містить адресу об'єднання.

союз u_type * un; un = & u1; cout <х; // 10

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

функція (u1); // функція виклику за допомогою виклику методом значення. . . void funct (об'єднання u_type un) {// отримання значення члена u1. cout <

Тепер давайте викличемо функцію за допомогою виклику за довідковим методом.

функція (& u1); // функція виклику за допомогою виклику методом refrence. . . void funct (об'єднання u_type un) {// отримання адреси u1. un-> x = 20. }

Існує особливий тип союзу в С ++, який називається Анонімний Союз ». Анонімний союз не може мати ім'я типу і жодна змінна такого об'єднання не може бути створена. Потрібно лише сказати компілятору, що змінні його членів мають спільне розташування. Змінна анонімного об'єднання може бути передана без нормального оператора крапки (.).

int main () {union {// визначте анонімний союз із назвою типу. int x, char c; float f; }; х = 10; // посилається на змінну об'єднання з оператором out dot cout <

В анонімному об'єднанні жодна функція-член не дозволена, вона не може містити приватних або захищених даних, а глобальний анонімний союз повинен бути вказаний як "статичний".

Бали, які слід пам’ятати для звичайної профспілкової декларації.

  • Визначення об'єднання також може містити конструктор і деструктор.
  • Об'єднання надає кілька способів перегляду одного і того ж місця пам'яті.
  • Союз не може успадкувати клас будь-якого типу.
  • Об’єднання не може бути базовим класом.
  • Об’єднання не може мати функцію віртуального члена.
  • Об'єднання не може мати статичну змінну.
  1. Структура використовує різні місця пам'яті для різних членів. Отже, відмітна цінність може бути надана всім членам. Але спілка виділяє однакове місце пам'яті для всіх членів. Отже, єдине значення може бути призначене для всіх членів.
  2. Структура має різні місця пам'яті для всіх членів; отже, він може містити одночасно кілька значень, і, як ми знаємо, об'єднання розділяє однакове місце пам'яті для всіх членів, отже, воно може зберігати одне значення за один раз.
  3. Як правило, загальний розмір структури більше, ніж загальний розмір об'єднання, оскільки розмір структури - це сума розміру всіх членів структур, а розмір об'єднання - це розмір члена члена найбільший тип.
  4. Структура забезпечує єдиний перегляд кожного місця, тоді як об'єднання забезпечує безліч переглядів одного місця.
  5. Ви можете оголосити анонімний союз, але не анонімну структуру.

Подібність:

  • І структура, і об'єднання мають однаковий спосіб декларування себе, створення змінних і однаковий спосіб доступу до членів змінних.
  • І Структура, і об'єднання можуть бути передані функції як методом виклику за значенням, так і викликом за посиланням.
  • І структура, і об'єднання є типом даних контейнерів і містять об'єкт будь-якого типу даних, включаючи іншу структуру, об'єднання, масив як їх членів.

Висновок:

І структура, і об'єднання - це тип даних контейнера, який містить член різних типів. Але структури використовуються, коли нам потрібно зберігати чітке значення для всіх членів у чіткому місці пам'яті. Об'єднання використовуються, коли потрібна конверсія типів.