Разница между структурой и объединением

Автор: Laura McKinney
Дата создания: 1 Апрель 2021
Дата обновления: 15 Май 2024
Anonim
Структуры в C++ | struct C++. Разница между структурой и классом. Изучение С++ для начинающих.#129
Видео: Структуры в C++ | struct C++. Разница между структурой и классом. Изучение С++ для начинающих.#129

Содержание


C ++ допускает все пять способов, которые предоставляет язык C для создания пользовательских данных. Этими пятью способами являются «структура», «битовое поле», «объединение», «перечисление», «определение типа». В статье ниже мы собираемся изучить разницу между структурой и объединением. Структура и объединение - это типы данных контейнера, которые могут содержать данные любого «типа». Одно существенное отличие, которое отличает структуру и объединение, состоит в том, что структура имеет отдельную ячейку памяти для каждого из своих членов, тогда как члены объединения разделяют одну и ту же ячейку памяти.

Давайте поймем разницу между структурой и объединением, а также сравнительную таблицу.

  1. Сравнительная таблица
  2. Определение
  3. Ключевые отличия
  4. сходства
  5. Вывод

Сравнительная таблица

Основа сравненияСоставсоюз
основнойОтдельная ячейка памяти выделена каждому члену структуры.Все члены союза имеют одну и ту же ячейку памяти.
декларацияstruct имя_структуры {
тип element1;
тип element2;
.
.
} переменная1, переменная2, ...;
union u_name {
тип element1;
тип element2;
.
.
} переменная1, переменная2, ...;
ключевое словоструктурасоюз
РазмерРазмер структуры = сумма размера всех элементов данных.Размер союза = размер крупнейших членов.
Стоимость магазинаХранит различные значения для всех членов.Хранит одинаковое значение для всех участников.
ВовремяСтруктура хранит несколько значений различных членов структуры.Союз хранит одно значение за раз для всех членов.
Способ просмотраПредоставьте один способ просмотра каждой ячейки памяти.Предоставить несколько способов просмотра одной и той же области памяти.
Анонимная функцияНет анонимной функции.Анонимный союз может быть объявлен.

Определение структуры

Структура представляет собой набор переменных разных типов данных, которые называются общим именем. Переменные в структуре называются «членами». По умолчанию все члены структуры являются «общедоступными». Когда вы объявляете структуру, вы создаете шаблон, который можно использовать для создания объектов структуры, совместно использующих одну и ту же организацию элементов данных и функций-членов. Декларации структуры всегда предшествует ключевое слово «struct», которое сообщает компилятору, что структура была объявлена. Давайте возьмем пример.


Давайте возьмем пример.

struct employee {строковое имя; строка company_name; струнный город; } Emp1, етр2;

Здесь мы объявляем структуру для хранения информации сотрудников. Объявление заканчивается точкой с запятой, поскольку объявление структуры является оператором, а в C ++ оператор завершается точкой с запятой.

Имя, данное структуре, определяет «тип» (в вышеприведенном примере имя структуры - «работник»). Переменные этих типов могут быть созданы, как указано выше, мы создали две переменные «emp1» и «emp2» типа «employee». В приведенном выше примере мы создали переменную «структура» сразу после объявления; поочередно, он может быть создан отдельно.

структура сотрудника emp1, emp2; // ключевое слово struct не является обязательным.

Члены структурной переменной могут быть инициализированы или доступны с помощью оператора точки (.).

emp1.name = "Ашока";

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


emp1.name = "Ашока"; emp1.company_name = "Teckpix"; emp1.city = "Дели"; етр2 = emp1; // присваиваем значения члена emp1 для emp2. соиЬ <

Здесь мы присвоили структурную переменную «emp1» для «emp2», поэтому «emp1» копирует все значения своих членов в соответствующий член «epm2».

Член структурной переменной может быть передан в функцию.

функц (emp1.city);

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

Funt (emp1); // вызов функции методом вызова по значению. , , void funct (struct employee emp) {// получение значений членов emp1. соиЬ <

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

Funt (& emp1); // вызов функции путем вызова ссылочного метода. , , void funct (struct employee * emp) {// получение адреса emp1. EMP-> город = «Нур»; // изменить значение члена (города) структурной переменной emp1. , }

Здесь структурная переменная передается по ссылке, поэтому изменение значения членов структурной переменной также отражается вне функции.

сотрудник отдела * emp; // удаление указателя на структуру типа employee. EMP = & emp1; // присваиваем адрес emp1 указателю. emp-> city // указатель доступа к городу-члену emp1.

Указатель на структуру также может быть создан; он содержит адрес структурной переменной.

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

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

Определение союза

Объединение - это область памяти, совместно используемая двумя или более различными типами переменных, объявленными для одного типа объединения. Ключевое слово, используемое для объявления союза - «союз». В C ++ объединение может содержать как функцию-член, так и переменные. По умолчанию все члены союза являются «публичными». Декларация о «союзе» аналогична декларации структуры.

union u_type {int x, char c; плавать f; } u1, u2;

Здесь мы объявили объединение с именем u_type. Члены типа u_type имеют тип «x» целочисленного типа, тип «c» символьного типа и тип «f» типа float. Мы также создали переменные объединения «u1» и «u2» типа «u_type» сразу после объявления объединения. Мы также можем объявить переменную объединения отдельно от объявления объединения.

int main () {union u_type u1, u2; // Ключевое слово union не является обязательным в C ++. }

Доступ к членам объединения может быть выполнен с помощью оператора точки (.), Перед которым стоит переменная объединения, а затем следует член этой переменной.

u1.x = 10;

Подобно структурам, агрегатная инициализация невозможна в объединении. Как мы знаем, объединение совместно использует одну и ту же ячейку памяти для всех своих членов одновременно, только одна переменная инициализируется, и все переменные автоматически обновляются с использованием инициализированного значения.

u1.x = 10; соиЬ <

Если вы попытаетесь изменить значение любого из членов u1. Другой член будет автоматически обновлен до этого значения.

u1.c = 65; соиЬ <

Пространство, отведенное союзу, равно размеру самого большого члена союза. Поскольку байт, выделенный для «char», равен 1 байту, «int» составляет 4 байта, а «float» составляет 4 байта, поэтому наибольший размер составляет 4 байта. Таким образом, память, выделенная для «u1» и «u2», составляет 4 байта.

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

Указатель на объединение может быть создан так же, как и в структуре. Указатель содержит адрес объединения.

union u_type * un; ип = & и1; соиЬ <Икс; // 10

Подобно структуре, объединение также может быть передано в функции как методами, то есть вызовом по значению и вызовом по ссылке.

функц (u1); // вызов функции методом вызова по значению. , , void funct (union u_type un) {// получение значения члена u1. соиЬ <

Теперь давайте вызовем функцию, используя метод вызова по ссылке.

функц (& и1); // вызов функции путем вызова метода refrence. , , void funct (union u_type un) {// получение адреса u1. un-> x = 20. }

В C ++ существует особый тип объединения, называемый «Анонимный союз». Анонимное объединение не может иметь имя типа, и никакая переменная такого объединения не может быть создана. Это только говорит компилятору, что его переменные-члены должны находиться в одном месте. На переменную анонимного объединения можно ссылаться без оператора обычной точки (.).

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

В анонимном объединении запрещена любая функция-член, она не может содержать личные или защищенные данные, а глобальный анонимный союз должен быть указан как «статический».

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

  • Определение объединения также может содержать конструктор и деструктор.
  • Объединение предоставляет несколько способов просмотра одной и той же области памяти.
  • Союз не может наследовать класс любого типа.
  • Союз не может быть базовым классом.
  • Объединение не может иметь функцию виртуального члена.
  • Объединение не может иметь статическую переменную.
  1. Структура использует различное расположение памяти для разных членов. Следовательно, отдельное значение может быть назначено всем членам. Но объединение выделяет одну и ту же ячейку памяти всем членам. Следовательно, одно значение может быть назначено всем членам.
  2. Структура имеет различное расположение памяти для всех членов; следовательно, он может содержать несколько значений одновременно, и, как мы знаем, объединение совместно использует одну и ту же ячейку памяти для всех элементов, следовательно, он может хранить одно значение за один раз.
  3. Как правило, общий размер структуры больше, чем общий размер объединения, потому что размер структуры является суммой размера всех членов структур, а размер объединения - размером члена самый большой тип.
  4. Структура обеспечивает одно представление каждого местоположения, тогда как объединение предоставляет несколько представлений одного местоположения.
  5. Вы можете объявить анонимный союз, но не анонимную структуру.

сходства:

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

Вывод:

И структура, и объединение являются типом данных контейнера, который содержит элементы разных типов. Но структуры используются, когда нам нужно хранить разные значения для всех членов в отдельной ячейке памяти. Объединения используются, когда необходимо преобразование типов.