Diferença entre estrutura e união

Autor: Laura McKinney
Data De Criação: 1 Abril 2021
Data De Atualização: 15 Poderia 2024
Anonim
Diferença entre estrutura e união - Tecnologia
Diferença entre estrutura e união - Tecnologia

Contente


O C ++ permite todas as cinco maneiras fornecidas pela linguagem C para criar dados personalizados. Essas cinco maneiras são 'estrutura', 'campo de bits', 'união', 'enumeração', 'typedef'. No artigo abaixo, estudaremos a diferença entre estrutura e união. A estrutura e a união são os tipos de dados do contêiner que podem conter dados de qualquer "tipo". A principal diferença que distingue estrutura e união é que a estrutura possui um local de memória separado para cada um de seus membros, enquanto os membros de um sindicato compartilham o mesmo local de memória.

Vamos entender a diferença entre estrutura e união, junto com um gráfico de comparação.

  1. Gráfico de comparação
  2. Definição
  3. Principais diferenças
  4. Semelhanças
  5. Conclusão

Gráfico de comparação

Base de comparaçãoEstruturaUnião
BasicO local de memória separado é alocado para cada membro da estrutura.Todos os membros da união compartilham o mesmo local de memória.
Declaraçãostruct struct_name {
tipo element1;
tipo element2;
.
.
} variável1; variável2; ...;
nome_de_ união
tipo element1;
tipo element2;
.
.
} variável1; variável2; ...;
palavra chavestructUnião
TamanhoTamanho da estrutura = soma do tamanho de todos os membros dos dados.Tamanho da união = tamanho dos maiores membros.
Valor da lojaArmazena valores distintos para todos os membros.Armazena o mesmo valor para todos os membros.
De uma vezUma estrutura armazena vários valores, dos diferentes membros, da estrutura.Um sindicato armazena um valor único de cada vez para todos os membros.
Modo de visualizaçãoForneça uma maneira única de visualizar cada local da memória.Forneça várias maneiras de visualizar o mesmo local de memória.
Recurso anônimoNenhum recurso anônimo.União anônima pode ser declarada.

Definição de Estrutura

A estrutura é uma coleção de variáveis ​​de diferentes tipos de dados, chamadas por um nome comum. As variáveis ​​em uma estrutura são chamadas de "membros". Por padrão, todos os membros de uma estrutura são "públicos". Ao declarar uma estrutura, você cria um modelo, que pode ser usado para criar objetos de estrutura, compartilhando a mesma organização de membros de dados e funções de membro. A declaração da estrutura é sempre precedida pela palavra-chave "struct", que informa ao compilador que uma estrutura foi declarada. Vamos dar um exemplo.


Vamos dar um exemplo.

struct employee {nome da string; string nome_empresa; cidade de cordas; } emp1, emp2;

Aqui, declaramos uma estrutura para armazenar as informações dos funcionários. A declaração é finalizada por ponto e vírgula, como a declaração de estrutura é uma declaração e, em C ++, a declaração é finalizada por ponto e vírgula.

O nome dado a uma estrutura define um "tipo" (no exemplo acima, o nome da estrutura é "funcionário"). As variáveis ​​desses tipos podem ser criadas, como acima, criamos duas variáveis ​​'emp1' e 'emp2' do tipo 'employee'. No exemplo acima, criamos uma variável "estrutura" logo após a declaração; alternativamente, poderia ser criado separadamente.

struct funcionário emp1, emp2; // a palavra-chave struct não é obrigatória.

Os membros de uma variável de estrutura podem ser inicializados ou podem ser acessados ​​usando o operador ponto (.).


emp1.name = "ashok";

As informações contidas em uma variável de estrutura podem ser atribuídas a outra variável de estrutura do mesmo tipo a seguir.

emp1.name = "ashok"; emp1.company_name = "Teckpix"; emp1.city = "Nova Deli"; emp2 = emp1; // atribuindo valores do membro de emp1 a emp2. cout <

Aqui, atribuímos a variável de estrutura 'emp1' a 'emp2', para que 'emp1' copie todo o valor de seus membros para o membro correspondente de 'epm2'.

O membro da variável de estrutura pode ser passado para a função

funct (emp1.city);

A variável de estrutura inteira pode ser passada para a função, pelos métodos chamada por valor e chamada por referência.

funt (emp1); // chamando a função por chamada pelo método de valor. . . void funct (struct employee emp) {// recebendo valores dos membros de emp1. cout <

Aqui, a alteração no valor de um membro da variável de estrutura não será refletida fora da função, pois uma variável é passada pelo método de chamada por valor. Agora vamos fazer o mesmo chamando pelo método de referência.

funt (& emp1); // chamando a função por chamada pelo método de referência. . . void funct (struct employee * emp) {// endereço de recebimento de emp1. emp-> cidade = "Nur"; // altera o valor do membro (cidade) da variável de estrutura emp1. . }

Aqui, a variável de estrutura é passada por referência, portanto, a alteração no valor dos membros da variável de estrutura também reflete fora da função.

srtuct employee * emp; // decalcando o ponteiro de estrutura do tipo employee. emp = & emp1; // atribuindo o endereço de emp1 ao ponteiro. emp-> city // ponteiro acessando a cidade membro de emp1.

O ponteiro para a estrutura também pode ser criado; mantém o endereço da variável de estrutura.

Na estrutura, a inicialização agregada é permitida quando a definição da estrutura não contém nenhum construtor definido pelo usuário ou funções virtuais ou classe base ou campo privado ou protegido.

int main () {struct epm3 = {"Anil", "Teckpix", "Nur"}; } // Possível, pois a estrutura do funcionário não contém nenhum dos itens mencionados acima.

Definição de União

Uma união é um local de memória compartilhado por dois ou mais tipos diferentes de variáveis ​​declarados em um único tipo de união. A palavra-chave usada para declarar uma união é "união". Em C ++, uma união pode conter função membro e variáveis. Por padrão, todos os membros do sindicato são "públicos". A declaração da “união” é semelhante à declaração da estrutura.

união u_type {int x, char c; flutuador f; } u1, u2;

Aqui, declaramos uma união chamada u_type. Os membros do u_type são 'x' do tipo inteiro, 'c' do tipo de caractere e 'f' do tipo flutuante. Também criamos as variáveis ​​de união 'u1' e 'u2', do tipo 'u_type', logo após a declaração de uma união. Também podemos declarar a variável union separadamente da declaração de uma união.

int main () {união u_type u1, u2; // A união da palavra-chave não é obrigatória em C ++. }

O acesso aos membros da união pode ser feito usando o operador ponto (.), Precedido pela variável union e seguido pelo membro dessa variável.

u1.x = 10;

Como estruturas, a inicialização agregada não é possível em uma união. Como sabemos, a união compartilha o mesmo local de memória para todos os seus membros por vez, apenas uma variável é inicializada e todas as variáveis ​​são atualizadas automaticamente com o valor inicializado.

u1.x = 10; cout <

Se você tentar alterar o valor de qualquer membro de 'u1'. O outro membro será atualizado automaticamente para esse valor.

u1.c = 65; cout <

O espaço alocado para o sindicato é igual ao tamanho do maior membro do sindicato. Como o byte alocado para 'char' é 1 byte, 'int' é 4 byte e 'float' é 4 bytes, portanto, o maior tamanho é 4 byte. Portanto, a memória alocada para 'u1' e 'u2' é de 4 bytes.

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

O ponteiro para a união pode ser criado exatamente como na estrutura. O ponteiro contém o endereço da união.

união u_type * un; un = & u1; cout <x; // 10

Assim como a estrutura, a união também pode ser transmitida para as funções pelos dois métodos, ou seja, chamada por valor e chamada por referência.

funct (u1); // chamando a função por chamada pelo método de valor. . . void funct (união u_type un) {// recebendo o valor do membro de u1. cout <

Agora, vamos chamar a função usando a chamada pelo método de referência.

funct (& u1); // chamando a função por chamada pelo método de referência. . . void funct (união u_type un) {// recebendo o endereço de u1. un-> x = 20. }

Existe um tipo especial de união em C ++ chamado União Anônima ”. A união anônima não pode ter o nome do tipo e nenhuma variável dessa união pode ser criada. É apenas para informar ao compilador que suas variáveis ​​de membro devem compartilhar o mesmo local. A variável de uma união anônima pode ser referida sem o operador ponto (.) Normal.

int main () {union {// define união anônima sem o nome do tipo. int x, char c; flutuador f; }; x = 10; // referiu a variável union com o operador out dot cout <

Na união anônima, nenhuma função de membro é permitida, ela não pode conter dados particulares ou protegidos, e a união anônima global deve ser especificada como "estática".

Os pontos a serem lembrados para a declaração normal da união.

  • A definição de uma união também pode conter construtor e destruidor.
  • A união fornece várias maneiras de visualizar o mesmo local de memória.
  • A união não pode herdar a classe de nenhum tipo.
  • A união não pode ser uma classe base.
  • A união não pode ter a função de membro virtual.
  • A união não pode ter uma variável estática.
  1. A estrutura usa local de memória diferente para diferentes membros. Portanto, o valor distinto pode ser atribuído a todos os membros. Mas, a união aloca o mesmo local de memória para todos os membros. Portanto, um único valor pode ser atribuído a todos os membros.
  2. A estrutura possui um local de memória diferente para todos os membros; portanto, ele pode conter vários valores por vez e, como sabemos, a união compartilha o mesmo local de memória para todos os membros, portanto, pode armazenar um único valor por vez.
  3. Geralmente, o tamanho total da estrutura é maior que o tamanho total da união, porque o tamanho de uma estrutura é a soma do tamanho de todos os membros das estruturas e o tamanho da união é o tamanho do membro da maior tipo.
  4. A estrutura fornece uma visualização única de cada local, enquanto a união fornece as várias visualizações de um único local.
  5. Você pode declarar uma união anônima, mas não uma estrutura anônima.

Semelhanças:

  • Tanto a estrutura quanto a união têm a mesma maneira de se declarar, criando variáveis ​​e a mesma maneira de acessar membros das variáveis.
  • Estrutura e união podem ser passadas para uma função pelos métodos chamados por valor e chamados por referência.
  • Estrutura e união são do tipo contêiner de dados e contêm um objeto de qualquer tipo de dados, incluindo outra estrutura, união, matriz como seus membros.

Conclusão:

Estrutura e união são o tipo de dados do contêiner que contém o membro de diferentes tipos. Mas as estruturas são usadas quando precisamos armazenar um valor distinto para todos os membros em um local de memória distinto. As uniões são usadas quando a conversão de tipos é necessária.