Classe versus estrutura

12

No C ++ e em outras linguagens influenciadas, existe um construto chamado Structure ( struct) e outro chamado the class. Ambos são capazes de conter funções e variáveis. Algumas diferenças são:

  1. A classe recebe memória na pilha e structrecebe memória na pilha (observação: isso está errado para C ++, mas talvez correto no que o OP chamou de "linguagens influenciadas")
  2. Variáveis ​​de classe são privadas por padrão e structsão públicas

Minha pergunta é: foi de structalguma forma abandonada para a classe? Se sim, por quê? Além das diferenças acima, a structpode fazer as mesmas coisas que uma classe. Então, por que abandoná-lo?

prometheuspk
fonte
por abandono, quis dizer por que um é usado sobre o outro.
Prometheuspk
sua pergunta responde a si mesma, eu acho.
Umair A.
3
A diferença entre classes e estruturas depende da linguagem. Algumas lições do C ++ não se aplicam realmente ao C #.
Job
6
Uhhhh. No C ++, você pode alocar objetos na pilha ou pilha. Onde você quiser.
jojo
8
Errado, errado, errado. Pilha versus pilha não tem nada a ver com a diferença.
Aaronaught 31/07

Respostas:

11

Não é de todo abandonado. De fato, mesmo linguagens modernas como C #, que fazem uso pesado de classainda oferecem a você struct. Quanto a quando é útil escolher um sobre o outro, refiro-lhe este artigo:

Escolhendo entre classes e estruturas

Citado no artigo do MSDN:

Considere definir uma estrutura em vez de uma classe se as instâncias do tipo forem pequenas e geralmente de curta duração ou geralmente incorporadas a outros objetos.

Não defina uma estrutura, a menos que o tipo tenha todas as seguintes características:

  • Representa logicamente um valor único, semelhante aos tipos primitivos (número inteiro, duplo e assim por diante).
  • Possui um tamanho de instância menor que 16 bytes.
  • É imutável.
  • Não precisará ser embalado com freqüência.
blubb
fonte
4
Esta resposta é realmente equivocada, já que o significado de struct / class .Net / C # é diferente de C ++: eles usam o mesmo nome, mas têm semântica diferente, dependendo do idioma !!! Em C ++, quase não há diferença entre struct e classe, e a pergunta está totalmente errada no primeiro ponto, o que é correto em c # e D, mas não em c ++. Portanto, o link para este artigo, que trata do .Net, está realmente muito errado. Não é C ++!
Klaim
@Klaim tecnicamente também não é adequado para C # (as estruturas podem estar na pilha) A distinção importante em C # é entre semântica de valor e semântica de referência, uma distinção que o C ++ não precisa, pois pode ter valores ou referências para qualquer coisa
jk.
17

Você está enganado sobre C ++: a única diferença significativa entre classe e estrutura é a diferença do especificador de acesso padrão. Struct e classe são sinônimos para todos os efeitos, acredito que o struct é mantido para compatibilidade retroativa com C.

Joris Timmermans
fonte
7
Não somente. O Struct é uma boa opção quando você deseja apenas despejar um monte de dados em um objeto e não adicionar nenhum comportamento a ele.
quant_dev 30/07/11
2
@Quant: Essa é uma terrível razão para usar uma estrutura. Eu realmente espero que esse comentário tenha sido explícito.
Aaronaught 31/07
1
@Aaronaught Por quê? Minha opinião sobre o uso de struct é bastante padrão, veja esta resposta por exemplo: stackoverflow.com/questions/54585/…
quant_dev
1
@Aaronaught Como você retorna vários valores, então? Digamos, um modelo de processo retorna o preço limpo, o preço sujo e a soma dos pagamentos acumulados.
quant_dev 31/07
1
@quant_dev - você pode decidir anexar algum meta-significado a uma estrutura para seus objetivos (e para ex-programadores em C que realmente fazem muito sentido), mas isso não muda o fato de que a única diferença entre a estrutura e palavras-chave de classe em C ++ é o acesso padrão.
Joris Timmermans
2

a linguagem D criou uma maior distinção entre classe e estrutura

uma estrutura em d nada mais é que um registro de dados alocado por pilha com algumas funções que você pode chamar (não há opção para herança, a menos que você use uma configuração de enumeração + união, ou seja, implemente o próprio polimorfismo) que é passado por valor

uma classe é como estamos acostumados a: funções virtuais, alocação de heap, herança (única), passada por ref

catraca arrepiante
fonte