Programação  
 
Rede de conhecimento computador >> Programação >> C /C + + programação >> Content
Quais são as principais diferenças entre C Struct e Class, como eles afetam a implementação do design de programas orientados a objetos em C?
Vamos dividir as principais diferenças entre as classes C e C ++ e como essas diferenças afetam o design e a implementação de programas orientados a objetos em C e C ++.

C Structs vs. C ++ Classes:Diferenças -chave

| Recurso | C struct | Classe C ++ | Impacto no OOP |
| -------------
| Acesso padrão | `public` (os membros são acessíveis por padrão) | `privado` (os membros são inacessíveis por padrão) | Encapsulamento |
| funções de membro (métodos) | Não é permitido diretamente. Você pode simulá -los usando ponteiros de função. | Permitido. As classes podem ter métodos (funções) que operam nos dados da classe. | Encapsulamento, comportamento |
| herança | Não suportado. | Suportado (herança única e múltipla). | Reutilização, polimorfismo |
| polimorfismo | Não suportado diretamente. Requer implementação manual (por exemplo, usando ponteiros de função e `void*`). | Suportado (funções virtuais, classes abstratas, interfaces). | Flexibilidade, extensibilidade |
| Construtores/destruidores | Não suportado. Inicialização normalmente feita com funções de atribuição ou inicialização. | Suportado. Os construtores inicializam os objetos, os destruidores limpam. | Gerenciamento de recursos |
| sobrecarga do operador | Não suportado. | Suportado. Permite que os operadores (+, -, *, ==, etc.) sejam redefinidos para objetos de classe. | Expressividade |
| modelos | Não suportado. | Suportado. Permite programação genérica (criando classes que podem funcionar com diferentes tipos de dados). | REUSIBILIDADE DE CÓDIGO |
| alocação de memória | Normalmente usado para alocação estática ou alocação de pilha. Pode ser usado com memória alocada dinamicamente através de ponteiros. | O mesmo que estruturas. Geralmente preferido nos contextos de objetos para criar objetos na pilha para utilizar o polimorfismo. | Gerenciamento de memória |

em detalhes:

1. Controle de acesso (encapsulamento):

- C STRESTS: Todos os membros de uma estrutura C são "públicos" por padrão. Isso significa que qualquer parte do seu código pode acessar e modificar diretamente os dados dentro da estrutura. Não há maneira interna de ocultar dados internos ou restringir o acesso.

- Classes C ++: O especificador de acesso padrão para uma classe C ++ é "privado". Isso significa que, por padrão, as variáveis ​​e funções de membros só são acessíveis a partir da própria classe ou de suas classes/funções de amigos. Você usa palavras -chave `public ',` protegido` e `privadas' para controlar a visibilidade dos membros da classe. Isso é crucial para encapsulamento , um dos princípios centrais da OOP.

2. funções de membro (métodos):

- C STRESTS: C STRESTS * não pode * conter diretamente funções (métodos) como membros. Para associar funções a uma estrutura, você normalmente usa ponteiros de função como membros da estrutura. Esta é uma abordagem mais indireta e menos integrada.

- Classes C ++: As classes * podem * conter funções de membro (métodos). Esses métodos operam com os dados da classe e fornecem uma maneira de interagir e manipular o estado do objeto. Isso combina firmemente os dados e as funções que operam, melhorando a organização e a manutenção.

3. herança:

- C STRESTS: C estruturas * não * apóie a herança. Você não pode criar uma nova estrutura que herda os membros de uma estrutura existente.

- Classes C ++: Classes C ++ * Do * Suporte Herança. Isso permite criar novas classes (classes ou subclasses derivadas) que herdem as propriedades e comportamentos das classes existentes (classes base ou superclasses). Isso promove a reutilização do código e permite modelar relacionamentos entre objetos (por exemplo, uma classe `cã 'herdando de uma classe` animal'). Você também pode usar a herança múltipla (herdando de várias classes base).

4. polimorfismo:

- C STRESTS: As estruturas C não têm suporte direto ao polimorfismo (a capacidade de um objeto de assumir muitas formas). Você pode*simular*o polimorfismo em C usando ponteiros de função e `void*`, mas requer mais codificação manual e é menos elegante. Você cria essencialmente uma tabela de ponteiros de função e seleciona a função apropriada para chamar com base no tipo de objeto.

- Classes C ++: O C ++ fornece suporte interno para o polimorfismo através de:
- Funções virtuais: Declarado com a palavra -chave `virtual` na classe base. Quando uma função virtual é chamada através de um ponteiro ou referência a um objeto de classe base, a função real executada é determinada em tempo de execução com base no tipo * real * do objeto (Dynamic Dispatch).
- Classes abstratas: Uma classe com pelo menos uma função virtual pura (declarada como `=0`). As classes abstratas não podem ser instanciadas diretamente, mas definem uma interface que as classes derivadas devem implementar.

5. Construtores e destruidores:

- C STRESTS: As estruturas C não têm construtores ou destruidores. A inicialização é normalmente feita atribuindo valores aos membros da estrutura após a declaração da estrutura ou usando funções de inicialização. A limpeza (liberando memória alocada dinamicamente) também deve ser feita manualmente.

- Classes C ++: As classes C ++ possuem construtores (funções de membro especiais que são chamadas automaticamente quando um objeto da classe é criado) e destruidores (funções especiais de membros que são automaticamente chamadas quando um objeto é destruído). Os construtores são usados ​​para inicializar os membros de dados do objeto, e os destruidores são usados ​​para liberar quaisquer recursos que o objeto mantenha (por exemplo, memória alocada dinamicamente).

6. sobrecarga do operador:

- C STRESTS: A sobrecarga do operador não é suportada em C. Você não pode redefinir o significado dos operadores (como +, -, ==) para estruturas.

- Classes C ++: O C ++ permite que você sobrecarregue os operadores para objetos de classe. Isso significa que você pode definir o que significa adicionar dois objetos da sua classe, compará -los por igualdade, etc. Isso pode tornar seu código mais expressivo e fácil de ler.

7. modelos:

- C STRESTS: C não possui modelos.

- Classes C ++: O C ++ suporta modelos, que permitem escrever código genérico que pode funcionar com diferentes tipos de dados sem precisar reescrever o código para cada tipo. Este é um recurso poderoso para a reutilização do código.

Impacto na implementação do projeto de programas orientados a objetos em C:

Devido a essas limitações, a redação de programas verdadeiramente orientados a objetos em C é * significativamente mais desafiadora e requer uma abordagem diferente. Você precisa implementar manualmente muitos dos recursos incorporados em classes C ++. Veja como você pode abordar o design OOP em C:

1. Encapsulamento emulador:
- Use a palavra -chave `static` para limitar o escopo de variáveis ​​e funções ao arquivo atual. Isso fornece uma forma de ocultação de informações, mas não é tão robusta quanto C ++ 'S `Private`.
- Use convenções de nomenclatura (por exemplo, prefixando membros "privados" com um sublinhado:`_private_member`) para indicar quais membros devem ser internos. Isso se baseia na disciplina do programador.

2. Métodos de simulação:
- Defina funções que levam um ponteiro para a estrutura como seu primeiro argumento (o "esse" equivalente ao ponteiro). Essas funções atuam como métodos para a estrutura.

`` `c
typedef struct {
int x;
int y;
} Apontar;

void point_move (ponto *p, int dx, int dy) {// "método" para ponto
p-> x +=dx;
p-> y +=dy;
}
`` `

3. imitar a herança:
- Composição: Incorporar uma estrutura dentro de outra estrutura. Isso oferece a você um relacionamento "Has-A" (por exemplo, um `carro 'tem um` motor`).

`` `c
typedef struct {
int potência;
// ...
} Motor;

typedef struct {
Motor motor; // carro * has-a * motor
int num_wheels;
} Carro;
`` `

- "herança" (manual): Inclua a estrutura da base como o primeiro membro da estrutura derivada. Isso garante que os membros da Base Struct sejam dispostos na memória antes dos membros da estrutura derivada. Você pode lançar um ponteiro para a estrutura derivada em um ponteiro para a estrutura da base (mas isso requer gerenciamento cuidadoso de memória e é propenso a erros).

`` `c
typedef struct {
int largura;
int altura;
} Retângulo;

typedef struct {
Base de retângulo; // "herda" do retângulo (primeiro membro)
int cor;
} ColorEdRectangle;

Void PrintrectanGlearea (retângulo *ret) {
printf ("área:%d \ n", ret-> width * ret-> altura);
}

ColorEdRectangle Cr ={{10, 5}, 0xff0000}; // Inicialize a estrutura aninhada

PRIRTRECTANGLARLEA ((retângulo*) &cr); // válido, como o retângulo é o primeiro na memória
`` `

4. Polimorfismo fingido:
- Use ponteiros de função dentro da estrutura para apontar para diferentes implementações da mesma função, com base no tipo do objeto. Isso é semelhante ao padrão de estratégia. Você precisa manter manualmente uma tabela de ponteiros de função.

`` `c
Typedef Struct Shape {
int x;
int y;
vazio (*desenhe) (forma da estrutura*); // ponteiro da função para desenho
} Forma;

Void Drawcircle (Shape *s) {
printf ("Círculo de desenho em ( %d, %d) \ n", s-> x, s-> y);
}

void drawsquare (forma *s) {
printf ("desenho quadrado em ( %d, %d) \ n", s-> x, s-> y);
}

Círculo de forma ={10, 20, drawcircle};
Forma quadrada ={30, 40, drawsquare};

Circle.Draw (&Circle); // chama o drawcircle
Square.Draw (&Square); // chamadas drawsquare
`` `

5. Gerenciamento de memória manual:
- Como as estruturas C não possuem construtores e destruidores, você deve gerenciar cuidadosamente a alocação e a desalocação de memória usando o `Malloc 'e` grátis'. Não fazer isso levará a vazamentos de memória.

em resumo:

- As estruturas C são estruturas de dados mais simples com recursos limitados. Eles são adequados para situações em que você só precisa agrupar dados relacionados.

- As classes C ++ fornecem recursos poderosos para a programação orientada a objetos, incluindo encapsulamento, herança, polimorfismo, construtores, destruidores, sobrecarga do operador e modelos.

-Enquanto você * pode * implementar conceitos orientados a objetos em C usando estruturas, ponteiros de função e gerenciamento de memória manual, é significativamente mais complexo, propenso a erros e menos sustentável do que o uso de classes C ++. Você está essencialmente reimplementando os recursos que o C ++ fornece nativamente.

Quando usar estruturas C em vez de classes C ++

Existem certas situações em que o uso de uma estrutura C, mesmo em um programa C ++, pode ser benéfico:

1. Dados antigos simples (POD) Tipos: Quando você possui uma estrutura de dados simples que contém apenas dados e não requer métodos ou comportamento especial, uma estrutura de pod pode ser mais eficiente. Uma estrutura de pod pode ser copiada trivialmente, comparada e serializada sem nenhum código especial. O C ++ oferece `std ::is_trivial` e` std ::is_standard_layout` traços do tipo para determinar se um tipo possui essas propriedades.

2. Interoperabilidade com o código C: Se você precisar interagir com o código C existente, o uso de estruturas C geralmente é a maneira mais fácil de passar dados entre os dois idiomas. O C ++ pode usar as estruturas C diretamente, enquanto as classes C ++ com recursos complexos (como construtores, funções virtuais etc.) não são diretamente compatíveis com C.

3. Programação de baixo nível/abstração de hardware: Na programação de baixo nível (por exemplo, drivers de dispositivo, sistemas incorporados), pode ser necessário controlar com precisão o layout da memória de suas estruturas de dados. As estruturas C oferecem mais controle sobre isso em comparação com as classes C ++, onde o compilador pode adicionar membros ocultos (como um ponteiro de tabela de função virtual).

4. seções críticas de desempenho: Embora os compiladores de C ++ modernos estejam altamente otimizando, as estruturas de pod às vezes podem oferecer uma pequena vantagem de desempenho em seções de código muito crítico de desempenho, porque não têm a sobrecarga associada às classes (como chamadas de função virtual). *No entanto,*, essa diferença geralmente é insignificante e um bom código C ++ pode ser executado da mesma forma, se não melhor.

em conclusão :
Embora C possa simular princípios orientados a objetos, o C ++ foi projetado para facilitá-los diretamente. O C ++ oferece ferramentas poderosas para encapsulamento, herança e polimorfismo, simplificando o design orientado a objetos em comparação com a abordagem mais manual necessária em C. Se o seu projeto se beneficiar dos princípios principais do OOP, o C ++ for a escolha mais adequada. As estruturas C são melhor usadas em projetos C ++ quando a interação direta do código C é necessária ou ao criar estruturas puramente centradas de dados.

Anterior :

Próximo :
  Os artigos relacionados
·Como aprender ponteiros em C 
·Como usar a função strerror em C + + 
·Como adicionar decimais em C + + 
·Como implementar várias pilhas 
·Como programar jogos em C + + 
·Como criar um arco em GTK Radiant 
·Como compilar em Borland C + + 
·Erros de sintaxe em C + + 
·Depuração no Visual C 
·Como compilar um GDB 64 -Bit 
  Artigos em destaque
·Você pode executar um programa Java no processador Cor…
·Como transferir uma String de uma caixa de texto a um D…
·Como fazer um jogo de Porco em Pseudocódigo 
·Como inserir ou atualizar uma consulta MySQL 
·Qual é o objetivo de um salto condicional na programaç…
·Como criar uma classe abstrata no NetBeans 
·Como levantar um aviso em Python 
·Como executar o código VB6 
·Como você faz backup e restaura o banco de dados MySQL…
·Como Incorporar JavaScript em Asp.net 
Cop e direita © Rede de conhecimento computador https://ptcomputador.com Todos os Direitos Reservados