paulo1205
(usa Ubuntu)
Enviado em 27/08/2014 - 07:52h
É normal, sim.
Pense no seguinte: quando você declara uma classe, o código executável de cada função-membro (ou método, no linguajar de que vem de Java) é gerado pelo compilador apenas uma vez para a classe. Quando você instancia objetos dessa classe e chama uma função-membro, de que modo o código já compilado vai ligar o código da função ao objeto que está sendo manipulado?
A forma tradicional de o fazer é embutir, no código compilado, um parâmetro oculto, que faz referência, por meio de um ponteiro, ao objeto que invocou o membro. Não é uma "gambiarra", mas um meio de fazer, especialmente se você levar em consideração que uma das diretivas de projeto do C++ é poder ser usado com um linker tradicional (o que permite, também, que o C++ possa compartilhar código com C e outras linguagens).
De certa maneira, faz sentido, não acha? Se toda vez que você chama uma função-membro não-estática tem de escrever
obj.nomefuncao(argumentos), converter isso para
classe::nomefuncao(&obj,argumentos), permitindo o uso do linker tradicional, me parece bastante lógico. Note, porém, que o compilador não permite que você use, no seu código, essa "sintaxe interna".
Em tempo: o C++ já foi uma extensão do C, e os primeiros compiladores experimentais de "C com classes", que depois veio a ser chamado de C++, eram pouco mais do que preprocessadores que convertiam código C++ em código C, e depois chamavam o compilador C. Hoje, no entanto, o
front-end do G++ é totalmente independente do
front-end do GCC, embora o
back-end de ambos -- e de todas as outras linguagens da suíte de compiladores da GNU -- seja o mesmo.