Depois de terminar minha aula de C ++, pareceu-me que as estruturas / classes são virtualmente idênticas, exceto com algumas pequenas diferenças.
Nunca programei em C antes; mas eu sei que tem structs. Em C, é possível herdar outras estruturas e definir um modificador de público / privado?
Se você pode fazer isso em C normal, por que diabos precisamos de C ++? O que torna as classes diferentes de uma estrutura?
Respostas:
Em C ++ , structs e classes são praticamente os mesmos; a única diferença é que onde os modificadores de acesso (para variáveis de membro, métodos e classes base) em classes são padronizados como privados, os modificadores de acesso em estruturas são padronizados como públicos.
No entanto, em C , uma estrutura é apenas uma coleção agregada de dados (públicos) e não tem outros recursos semelhantes a classes: nenhum método, nenhum construtor, nenhuma classe base etc. Embora C ++ tenha herdado a palavra-chave, ela estendeu a semântica. (É por isso, no entanto, que as coisas são padronizadas para estruturas públicas - uma estrutura escrita como uma estrutura C se comporta como tal.)
Embora seja possível falsificar alguma OOP em C - por exemplo, definir funções que levam um ponteiro para uma estrutura como seu primeiro parâmetro ou, ocasionalmente, coagir estruturas com os mesmos primeiros campos a serem "sub / superclasses" - é sempre uma espécie de aparafusado e não faz realmente parte da linguagem.
fonte
Fora as diferenças no acesso padrão (público / privado), não há diferença.
No entanto, algumas lojas que codificam em C e C ++ usarão "classe / estrutura" para indicar o que pode ser usado em C e C ++ (estrutura) e que são apenas C ++ (classe). Em outras palavras, neste estilo todas as estruturas devem funcionar com C e C ++. É por isso que havia uma diferença em primeiro lugar há muito tempo, quando C ++ ainda era conhecido como "C com classes".
Observe que as uniões C funcionam com C ++, mas não o contrário. Por exemplo
E da mesma forma
só funciona em C
fonte
Vou adicionar às respostas existentes porque o C ++ moderno agora é uma coisa e as Diretrizes Principais oficiais foram criadas para ajudar com questões como essas.
Esta é uma seção relevante das diretrizes:
Os exemplos de código fornecidos:
Class
s funcionam bem para membros que são, por exemplo, derivados uns dos outros ou inter-relacionados. Eles também podem ajudar na verificação de sanidade na instanciação.Struct
s funcionam bem para ter "pacotes de dados", onde nada de especial está realmente acontecendo, mas os membros logicamente fazem sentido serem agrupados.A partir disso, faz sentido que
class
existam para suportar encapsulamento e outros conceitos de codificação relacionados, para os quaisstruct
os programas simplesmente não são muito úteis.fonte
struct
s são os mais portáteis. Eles podem ser usados por C ou C ++ ou para frente e para trás. Eles também podem ser descompactados em Python usando ostruct
módulo, por exemplo. Se seus Prioriza projeto ser compatível com outras linguagens, interfaces ou sistemas, preferemstruct
maisclass
. Para assuntos estritamente internos do programa, prefiraclass
.Não é possível definir funções-membro ou derivar estruturas umas das outras em C.
Além disso, C ++ não é apenas C + "derivar estruturas". Modelos, referências, namespaces definidos pelo usuário e sobrecarga de operadores não existem em C.
fonte
power
dos structs em C. Então, C ++ só usa structs para ser 'retroativamente' compatível com C?struct
quero dizer um tipo de coisa POD amplamente passivo.std::less
) são definidos como estruturas, não classes.Mais uma diferença em C ++, quando você herda uma classe de struct sem nenhum especificador de acesso, ela se torna herança pública onde, como no caso da classe, é herança privada.
fonte
C ++ usa estruturas principalmente para 1) compatibilidade com versões anteriores com C e 2) tipos de POD. C structs não possuem métodos, herança ou visibilidade.
fonte
std::less
) são definidos como estruturas, não classes.