Curiosidade g++ [RESOLVIDO]

1. Curiosidade g++ [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 27/08/2014 - 00:21h

Queria que alguém me tirasse uma dúvida, um tanto inútil mas uma dúvida, eu tive uns erros aqui no momento da compilação e vi umas coisas "esquisitas" (claro, não são, mas eu achei estranho). Tipo, era mais ou menos assim o erro:
NomeDaClasse::foo(this, argumento)

Sendo que eu não tenho um ponteiro this como argumento da função foo.
Então, o g++ ele faz alguma "conversão" de métodos e adiciona esse primeiro argumento como sendo um ponteiro para o objeto que o usa?

Sei lá, isso não é meio que uma gambiarra? Ou é normal do compilador/linguagem?

C++ seria então só um C disfarçado com roupa de orientação a objetos?


  


2. MELHOR RESPOSTA

Paulo
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.

3. Re: Curiosidade g++ [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/08/2014 - 19:18h

Não pense que eu critiquei usar a terminologia "método". Só quis explicar que aquilo que eu chamo de "função-membro" é o que outras linguagens chamam de método.

E a minha forma de chamar vem justamente do fato de que eu comecei a ter contatos com OOP através de C++ e utilizando literatura específica de C++, e todos os (três, sendo dois do Bjarne Stroustrup) livros que eu usei as chamavam assim.

---
P.S.: Na verdade, eu tenho, sim, algumas críticas a "método", pois a palavra significa "modo de agir" ou "maneira de proceder". Posso estar redondamente enganado nos conceitos, pois nunca estudei OOP do ponto de vista da teoria pura, mas as funções-membros do C++ me transmitem mais uma ideia de ações que os objetos -- ou mesmo classes -- realizam ou sofrem, não as maneiras pelas quais eles realizam ou sofrem ações. Mais ainda, os nomes dessas funções/métodos costumam ser verbos, mesmo em (e talvez “principalmente em”) Java, que indicam justamente as ações dos/sobre os objetos ou classes; de um método, eu sinto que deveria esperar nomes que fossem substantivos. Mas isso tudo pode ser, além da ignorância acima confessa, também uma questão de gosto.


4. Re: Curiosidade g++ [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/08/2014 - 19:52h

Veja como são as coisas: você usa, para chamar de método, a mesma justificativa que eu uso para não chamar...






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts