C e provavelmente muitas outras linguagens fornecem uma struct
palavra - chave para criar estruturas (ou algo semelhante). Estes são (pelo menos em C), de um ponto de vista simplificado, como classes, mas sem polimorfismo, herança, métodos e assim por diante.
Pense em uma linguagem orientada a objetos (ou com vários paradigmas) com estruturas no estilo C. Onde você os escolheria em relação às aulas? Agora, não acredito que eles devam ser usados com OOP, pois as classes parecem substituir seus propósitos, mas me pergunto se há situações em que elas poderiam ser preferidas às classes em programas orientados a objetos e em que tipo de situações. Existem tais situações?
Respostas:
Há uma distinção que eu já vi em alguns livros entre objetos portadores de estado e objetos que fornecem funcionalidade. Os termos exatos diferem de fonte para fonte. Mas de um modo geral, os primeiros se distinguem por ter um monte de campos e um monte de pares simples de getters-setters (e talvez um construtor).
Isso é particularmente comum em Java, para classes explicitamente marcadas como "serializáveis".
Eu argumentaria que esse tipo de classe faz mais sentido como estruturas, se você sentir que não há necessidade de ocultar diretamente os membros (por exemplo, no caso de tipos aninhados).
fonte
Em C, não há classes, assim
struct
é o caminho para agrupar dados. Em C ++,struct
é o mesmo queclass
exceto que o acesso à herança e aos membros épublic
por padrão e nãoprivate
. C # também tem uma espécie destruct
, mas não sei C # suficiente para comentar. O Common Lisp tem adefstruct
forma, que funciona da maneira mais semelhante a Csstruct
, considerando a diferença de idioma, e é diferente de uma classe Common Lisp Object System.Há, no entanto, uma diferença conceitual entre um pacote de dados relacionado e uma classe real, e em C ++
struct
é freqüentemente usado para um pacote de dados, enquantoclass
é usado para objetos que deveriam ter seu próprio comportamento. Como diretriz, eu diria que aclass
representa algo sobre o qual você pode dizer algo útil, como uma classe invariável, enquanto astruct
seria mais vagamente acoplada a valores de dados que não dependem muito dos outros.fonte
struct
e aclass
é mais significativa em C # - o principal é que astruct
é um tipo de valor e aclass
é um tipo de referência. A Microsoft recomenda não usar astruct
se o conteúdo for maior que 16 bytes ou mais.Em um nível muito básico, qual é a diferença entre uma estrutura e uma classe de dados pura (uma que não possui funcionalidade além dos acessadores de propriedade)?
Nada além da pegada de memória realmente.
fonte
A resposta aceita é boa. Eu gostaria de adicionar ...
Às vezes, é melhor colocar um método dentro de uma classe. Outras vezes, é melhor ter uma função externa onde a estrutura / classe é passada como parâmetro (mesmo se você estiver usando o estilo OOP).
exemplo de quando colocar um método dentro da classe: Rectangle.CaclulateArea ()
exemplo de quando colocar uma função fora da classe: Canvas.Draw (Rectangle rect)
você poderia colocar Draw () dentro do retângulo e funcionaria. Mas o desenho é uma operação dependente da camada. Você não desenharia no lado do servidor, mas no lado do cliente. Draw () não faria sentido sequer existir no servidor. No entanto, "CalculateArea ()" é independente da camada e é um atributo verdadeiro do retângulo, portanto, é melhor incluí-lo como método de membro.
fonte
Para mim, a grande diferença é se existe uma classe invariável ou não.
Ou, em outras palavras: sou livre para alterar qualquer campo para qualquer valor a qualquer momento? Se sim, é uma estrutura; Caso contrário, é uma aula.
O exemplo usual de uma estrutura é um ponto 2D, com apenas um membro X e Y, que pode ter qualquer valor e é totalmente independente um do outro. O acesso público é aceitável.
Um exemplo de classe é a combinação de um ponteiro para uma matriz de caracteres e um campo de comprimento: o comprimento depende do valor do ponteiro e, portanto, não deve ser uma estrutura. Os campos devem ser privados e o acesso deve passar por setters e getters para garantir a classe invariável.
fonte
1) Rede
struct
s: estruturas que são transmitidas através do fio.De maneira mais geral e formal, qualquer classe que você precise ser POD, trivial, layout padrão ou um conceito relacionado. Para uma excelente discussão desses conceitos, com exemplos, consulte esta resposta (é para C ++ 11).
2) Functors (predicados em particular), que você passaria para funções como
std::remove_if
. Em outras palavras, classes semelhantes / herdadasstd::binary_function
ou similares.3) Conceitos de metaprogramação, que podem conter apenas
constexpr
s públicos e / outypedef
s.Editar: Nota: Esta resposta se aplica a classes C ++ e estruturas.
fonte