Разлика между структура и съюз

Автор: Laura McKinney
Дата На Създаване: 1 Април 2021
Дата На Актуализиране: 15 Може 2024
Anonim
В чем разница между КАТОЛИЧЕСТВОМ и ПРАВОСЛАВИЕМ ?
Видео: В чем разница между КАТОЛИЧЕСТВОМ и ПРАВОСЛАВИЕМ ?

Съдържание


C ++ позволява всичките пет начина, предоставени от езика на C за създаване на персонализирани данни. Тези пет начина са „структура“, „битово поле“, „обединение“, „изброяване“, „typedef“. В статията по-долу ще проучим разликата между структура и съюз. Структурата и обединението и двете са типове данни за контейнери, които могат да съхраняват данни от всякакъв „тип“. Основната разлика, която отличава структурата и обединението е, че структурата има отделно място в паметта за всеки от своите членове, докато членовете на съюз споделят едно и също място в паметта.

Нека разберем разликата между структура и съюз, заедно с сравнителна диаграма.

  1. Сравнителна диаграма
  2. дефиниция
  3. Ключови разлики
  4. прилики
  5. заключение

Сравнителна диаграма

Основа за сравнениеструктурасъюз
ОсновенОтделното място на паметта се разпределя за всеки член на структурата.Всички членове на съюза споделят едно и също място в паметта.
декларацияstruct struct_name {
тип елемент1;
тип елемент2;
.
.
} променлива1, променлива2, ...;
съюз u_name {
тип елемент1;
тип елемент2;
.
.
} променлива1, променлива2, ...;
ключова думаструктурасъюз
размерРазмер на структурата = сума от размера на всички членове на данните.Размер на Union = размер на най-големите членове.
Стойност на магазинаСъхранява различни стойности за всички членове.Съхранява еднаква стойност за всички членове.
На времеСтруктурата съхранява множество стойности на различните членове на структурата.Съюзът съхранява еднократна стойност наведнъж за всички членове.
Начин на гледанеОсигурете един начин за преглед на всяко място в паметта.Осигурете няколко начина за преглед на едно и също място в паметта.
Анонимна функцияБез анонимна функция.Анонимен съюз може да бъде деклариран.

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

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


Да вземем пример.

служител на структура {име на низ; string company_name; струнен град; } Emp1, emp2;

Тук декларираме структура за съхранение на информацията на служителите. Декларацията се прекратява с точка и запетая, тъй като декларацията на структурата е оператор, а в C ++ изразът се прекратява с точка и запетая.

Името, дадено на структурата, определя "тип" (в горния пример името на структурата е "служител"). Променливите от тези типове могат да бъдат създадени, както по-горе, създадохме две променливи 'emp1' и 'emp2' от тип "служител". В горния пример създадохме променлива „структура“ веднага след декларацията; алтернативно, той може да бъде създаден отделно.

структура служител emp1, emp2; // структурата на ключовите думи не е задължителна.

Членовете на структурна променлива могат да бъдат инициализирани или да бъдат достъпни с помощта на оператора dot (.).

emp1.name = "Ашок";

Информацията, съдържаща се в една променлива на структурата, може да бъде присвоена на друга структурна променлива от същия тип, както следва.


emp1.name = "Ашок"; emp1.company_name = "Teckpix"; emp1.city = "Delhi"; emp2 = emp1; // присвояване на стойности на члена на emp1 на emp2. Cout <

Тук сме присвоили структурната променлива 'emp1' до 'emp2', така 'emp1' копира цялата стойност на своите членове в съответния член на 'epm2'.

Членът на структурната променлива може да бъде предаден на функцията.

Funct (emp1.city);

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

funt (emp1); // функция за извикване чрез извикване по стойност. , , void funct (struct служител emp) {// получаване на стойности на членове на emp1. Cout <

Тук промяната в стойността на член на променливата на структурата няма да се отразява извън функцията, тъй като променливата се предава чрез повикване чрез метод на стойност. Сега нека направим същото като се обадим по референтен метод.

funt (& emp1); // функция за извикване чрез повикване чрез референтен метод. , , void funct (struct служител * emp) {// получаване на адрес на emp1. emp-> град = "Нур"; // променете стойността на член (град) на променлива структура 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 () {union u_type u1, u2; // Съюзът на ключовите думи не е задължителен в C ++. }

Достъпът до членовете на обединението може да се извърши с помощта на оператор dot (.), Предхождащ се от променлива Union и последващ член на тази променлива.

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; ООН = & u1; Cout <х; // 10

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

Funct (U1); // функция за извикване чрез извикване по стойност. , , void funct (обединение u_type un) {// получаване на стойността на члена на u1. Cout <

Сега, нека да извикаме функцията, използвайки обаждане по референтен метод.

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

Има специален тип съюз в C ++, наречен Анонимен съюз “. Анонимният съюз не може да има името на типа и не може да се създаде променлива на такъв съюз. Остава само да се каже на компилатора, че неговите променливи членове трябва да споделят едно и също място. Променливата на анонимен съюз може да бъде отнесена без нормалния оператор на точка (.).

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

В анонимен съюз не е позволена функция член, той не може да съдържа лични или защитени данни и глобалният анонимен съюз трябва да бъде определен като „статичен“.

Точките, които трябва да запомните за нормалната декларация на съюз

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

прилики:

  • Както структурата, така и съюзът имат един и същи начин на деклариране, създаване на променливи и един и същ начин за достъп до членове на променливите.
  • Както Структурата, така и обединението могат да бъдат предадени на функция и от двата метода call by value и call by reference.
  • Както Структурата, така и съюзът са тип данни от контейнери и съдържат обект от всякакъв тип данни, включително друга структура, съюз, масив като техни членове.

Заключение:

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