Estruturas e classes em C ++
C ++ continua a ser uma linguagem minoritária para desenvolvimento embarcado, mas é comumente adotada por desenvolvedores quando os projetos se tornam muito grandes para que C possa ser usado com eficiência. Esses desenvolvedores estão normalmente em transição de C para C ++ e as diferenças sutis entre as linguagens representam uma parte significativa de sua curva de aprendizado. O C ++ tem estruturas, como o C, mas não são iguais. C ++ possui classes, que são notavelmente semelhantes a estruturas. Este artigo revela os detalhes desses elementos de linguagem.
Estruturas em C
Uma estrutura em C é um item de dados composto personalizado (objeto), que pode ser construído a partir dos tipos de dados integrados existentes ( int , char , etc.), campos de bit (inteiros de tamanho de bit especificado) e outras estruturas. A ideia é agregar uma série de itens de dados que devem estar juntos. Por exemplo, uma estrutura para manter coordenadas tridimensionais pode ter a seguinte aparência:
coordenadas da estrutura {float x; float y; float z;};
Este código informa ao compilador o que coordenadas de estrutura parece. Você pode então declarar variáveis deste tipo assim:
localização das coordenadas da estrutura;
A variável localização é do tipo coordenadas de estrutura e seus campos internos podem ser endereçados usando o operador “ponto”:
location.x =1.0; location.y =2.0; location.z =9,99;
Claro, um efeito semelhante poderia ser alcançado usando três flutuadores separados variáveis com nomes como location_x etc. No entanto, é muito mais fácil lidar com a localização como uma única variável que pode ser passada para funções etc.
A capacidade de incluir campos de bits dá às estruturas uma capacidade não disponível em nenhum outro lugar em C. Aqui está um exemplo:
struct bitreg {unsigned up:3; não assinado:3; polaridade sem sinal:2;};
Cada um dos campos em uma variável do tipo struct bitreg tem um tamanho de bit específico. O compilador garante que os dados sejam armazenados de forma sensata, portanto, esperaríamos que essa variável cabesse em um byte. Além disso, todo o código “bit bashing” para acessar os campos dentro do byte é gerado automaticamente. Assim, o programador pode simplesmente acessá-los desta forma:
controle de struct bitreg; control.up =1; control.down =2; control.polarity =3;
Para a maior parte, o uso de estruturas em C é bastante simples e torna o código mais fácil de entender, sem impacto na eficiência de execução. No entanto, existem dois pontos sobre os quais os desenvolvedores incorporados devem estar cientes:
- Processadores modernos de ponta (normalmente 32 bits) têm conjuntos de instruções que acomodam prontamente o uso de estruturas. Na verdade, eles foram projetados para fazer exatamente isso. No entanto, a maioria das CPUs de baixo custo não oferece tais eficiências, portanto, o uso de estruturas precisa de cuidados.
- Os campos de bits são um recurso interessante e podem resultar em um código eficiente e legível. Os desenvolvedores incorporados podem detectar imediatamente uma oportunidade:usar campos de bits para acessar os registros de controle do dispositivo. Muitos dispositivos periféricos têm registros de 1 palavra ou 1 byte de largura que contêm vários campos de bits. Isso parece uma ótima combinação e às vezes pode ser feito para funcionar. Mas há dois problemas:
- O layout exato dos campos de bits é determinado pelo compilador. Se tudo for mapeado corretamente em um dispositivo, o código pode funcionar bem. No entanto, uma mudança de compilador, ou mesmo apenas uma atualização do compilador, pode quebrar o código.
- O código gerado pelo compilador para acessar os campos de bits provavelmente usará várias operações AND / OR e vários acessos ao registro, o que pode ser problemático. Além disso, alguns registros de dispositivo são somente para gravação e nunca seriam acomodados no código gerado pelo compilador.
Embora uma estrutura C se pareça um pouco com um novo tipo de dados, na verdade não é. Um tipo de dados normalmente teria um intervalo de operações que podem ser executadas nele; este não é o caso de uma estrutura C. Para fazer qualquer coisa em uma estrutura C, além de apontar para ela, você precisa acessar os campos internos. Este assunto é tratado em C ++.
Aulas em C ++
A linguagem C ++ possui vários recursos orientados a objetos. Um deles é o conceito de classe , o que permite a descrição de algo muito mais parecido com um novo tipo de dados. Uma variável (normalmente chamada de objeto ) pode ser instanciado da classe; ou seja, é um objeto desse novo tipo.
Uma classe C ++ tem quase exatamente a mesma sintaxe que uma estrutura C e alguns recursos muito semelhantes. No entanto, existem algumas diferenças importantes:
- Uma classe também pode conter funções (chamadas métodos ).
- Os métodos e variáveis de membro são ocultados do mundo exterior, a menos que sua declaração siga um público:
- Pode haver um par de métodos especiais - o construtor e o destruidor - que são executados automaticamente quando uma instância da classe (um objeto) é criada e destruída, respectivamente.
- Os operadores para trabalhar no novo tipo de dados podem ser definidos usando métodos especiais (funções de membro).
- Uma classe pode ser usada como base para a definição de outra (isso é denominado herança ).
- A declaração de uma variável do novo tipo (uma instância da classe; um objeto) requer apenas o nome da classe - a palavra-chave classe não é necessário.
A maioria desses recursos é ilustrada neste exemplo:
classe minhaclasse {char a; int b; public:void fun (); minha classe(); ~ myclass ();}; myclass myobj; myobj.fun ();
As variáveis de membro a e b estão acessíveis apenas para as três funções-membro fun () , myclass () e ~ myclass () . As duas últimas funções são o construtor e o destruidor. Apenas diversão () é provável que seja chamado pelo código do usuário. O código real para todas as três funções seria definido em outro lugar e está associado à classe usando o :: operador, assim:
void myclass ::fun () {...
Estruturas em C ++
Além das classes, C ++ possui estruturas, que são compatíveis com versões anteriores de C. No entanto, uma estrutura C ++ também possui os mesmos recursos adicionais que são possuídos pelas classes. Esta é apenas uma das diferenças entre uma estrutura e uma classe em C ++. A acessibilidade padrão de variáveis de membro e funções em uma classe é privada, como vimos; o padrão em uma estrutura é público. Assim, a funcionalidade da classe anterior também pode ser expressa assim:
struct mystruct {void fun (); minha classe(); ~ myclass (); private:char a; int b;};
Usando classes e estruturas em C ++
Tendo adquirido essas informações, recomenda-se que você não as explore muito. Há muitos motivos para usar estruturas apenas para o tipo de funcionalidade oferecida em C e classes quando você precisa de recursos extras. Primeiramente, é uma questão de legibilidade do código. Outro desenvolvedor pode não ser tão claro quanto aos detalhes e o código escrito de uma forma “não padronizada” pode ser confuso.
Uma das principais prioridades ao escrever o código é garantir que ele seja legível (=sustentável). Alguém - pode ser você - pode precisar olhar este código daqui a um ano e entender o que ele faz. Um conselho:presuma que a pessoa que manterá seu código é um psicopata armado, que tem paciência limitada e sabe seu endereço residencial.
Integrado
- Variáveis, literais e constantes de C++
- Classes e objetos C++
- Gerenciamento de memória C++:novo e excluir
- Herança pública, protegida e privada C++
- Semáforos:serviços utilitários e estruturas de dados
- Grupos de sinalizadores de evento:serviços de utilidade e estruturas de dados
- Java - Objeto e Classes
- Classes de armazenamento em C++
- Data e hora do C++
- Estruturas de dados C++