| Em C, você consegue "structs encapsuladas" colocando um void* na struct, de modo que o void* aponta para os dados reais que são desconhecidos para os usuários da struct. Nesse caso os
usuários da struct não sabem como interpretar os elementos apontados por void*, mas as funções
de acesso processam o void* para o tipo apropriado, embora oculto. Isso resulta em uma forma de
encapsulamento. Infelizmente, esse mecanismo não cobre a
segurança de tipos, e ainda impõe a chamada de uma função mesmo para acessar dados
triviais da struct (se você permitisse acesso direto aos campos da struct, qualquer um e
todo mundo estaria habilitado a acessá-la diretamente, já que todos teriam
obrigatoriamente que saber como interpretar os elementos apontados pelo void*, o que resultaria
ainda em mais dificuldade para se alterar a estrutura de dados).
O overhead das chamada de função é pequeno, mas deve ser
considerado. As classes C++ permitem que as chamadas de função sejam expandidas inline. Isso permite
que você tenha a segurança do encapsulamento, aliado a velocidade do acesso direto. Mais
ainda, os tipos de dados dos parâmetros das funções inline são
verificados pelo compilador, o que é uma vantagem até mesmo sobre as macros #define do C. |