Oi Joao,

Se voce procurar em qualquer livro de programacao orientada por objetos vai 
encontrar a palavra "referencia" e nao "ponteiro". Nao eh a toa que isto 
ocorre, porque as linguagens de programacao, vou citar Delphi/Java, tem 
liberdade para internamente decidir como serah feito o acesso a um objeto. 
Se uma variavel definida, como no exemplo abaixo:

var x : TButton;

 fosse apenas um ponteiro, isto significaria que dentro da variavel "x" 
estaria fisicamente o endereco de onde a instancia (o objeto) da TButton 
esta na memoria. Ou seja:

[x] ------------> botao

A variavel "x"  estaria apontado para as informacoes (atributos/metodos) do 
botao.

Na verdade, no caso do Delphi, a representacao dos "apontamentos" seria algo 
parecido com o mostrado abaixo:

[x]--------[uma estrutura em memoria]-------->[outra estrutura em 
memoria]-----......----> botao

A variavel "x" esta apontado para o endereco de uma estrutura em memoria, 
que por sua vez possui o endereco de outras estruturas de memoria, sendo 
somente no final desta cadeia de apontamentos eh que as informacoes do botao 
podem ser encontradas.

Ao usar o termo "referencia" os livros entendem que as implementacoes das 
linguagens de programacao tem toda a liberdade de usarem outras formas de 
acesso aos objetos, nao soh a forma de acesso direto (se fosse acesso direto 
seriam chamados de ponteiros). Por exemplo, ainda na linguagem Delphi: 
Quando um objeto eh criado, diversas estruturas de memoria sao criadas para 
representar este objeto. Uma destas estruturas eh a VMT (Virtual Method 
Table) que contem o endereco de todos os metodos da classe TButton (vou 
continuar usando o botao como exemplo mas vale para as demais classes) e o 
endereco de todos os metodos das classes ancestrais de TButton. Outra destas 
estruturas contem o endereco dos atributos de instancia. Outra estrutura 
estrutura teria o endereco dos atributos de classe, e por ai vai, formando 
uma cadeia de estruturas de memoria.

Na linguagem Java, por outro lado, uma variavel definida como:

Button x;

Internamente a variavel "x" nao tem o endereco de memoria de nenhuma 
informacao (no caso o objeto botao). Na verdade, eh apenas um 
indentificador, porque os enderecos de memoria sao tratados e resolvidos 
internamente pela VM (maquina virtual) do Java. Logo, no caso do Java a 
variavel "x" nao eh sequer um ponteiro, porque nem possuir um endereco de 
memoria ela possui. A variavel "x" eh uma referencia.

Por causa da possibilidade das implementacoes das linguagens, terem a total 
liberdade de decidirem como vao representar internamente o acesso aos 
objetos, eh que os livros usam as palavras "Referencia a objeto" e nao 
ponteiro. Usar o termo "ponteiro" implicaria que todas as definicoes de 
variaveis como :

var x : TButton; // delphi
Button x; // java

obrigariam as linguagens a colocar dentro de "x" o endereco de memoria das 
informacoes dos objetos. Os "ponteiros" do delphi, por exemplo, nao possuem 
o endereco direto da informacao de um botao, mas o endereco de uma estrutura 
na memoria que apontam para diversas outras estruturas que somadas vao 
compor o objeto botao. Soh isso desclassifica a variavel "x"  de ser chamada 
de ponteiro, porque ela nao aponta diretamente para onde a informacao 
(atributos e metodo) do objeto esta na memoria.

Experimente tentar executar o codigo abaico e veja se o compilador nao irah 
"berrar":

procedure TForm1.Button1Click(Sender: TObject);
var
  s : string;
begin
  s := TButton(Button1^).Name;
end;

Porque ele nao permite a deferencia acima (Button1^.Name)? Se "Button1" 
fosse um ponteiro nao deveria permitir este tipo de acesso ao atributo 
"Name" ? Afinal, se "Button1" fosse um ponteiro, e usando a sintaxe do 
Delphi para deferenciamento de ponteiros, este "ponteiro" deveria permitir 
acessar um de seus atributos. Tanto nao eh um ponteiro que o compilador nao 
permitie este tipo de comando, justamente porque "Button1" nao eh um 
ponteiro, eh uma referencia.

A linuagem Java jah eh outro exemplo de que a variavel "x", do exemplo 
anterior, nao eh um ponteiro porque sequer esta variavel tem dentro de si 
enderecos de memoria, mas apenas identificadores que sao criados, e tratados 
internamente pela JVM.

Por isso eh que eu escrevi que "x" nao deve ser classificado como ponteiro, 
mas sim como uma "referencia a objeto".

Desculpem, mas este e-mail foi maior ainda que o anterior.

----- Original Message ----- 
From: "Joao Morais" <[EMAIL PROTECTED]>
To: <delphi-br@yahoogrupos.com.br>
Sent: Wednesday, March 02, 2005 11:49 PM
Subject: Re: [delphi-br] Ponteiros


>
> Clayton Bonelli wrote:
>
>> Desculpe ser chato quanto a isso, ou mesmo muito purista do conceito.
>>
>> Vejamos o seguinte: por definicao um ponteiro corresponde ao endereco 
>> onde
>> uma informacao se encontra na memoria, sendo assim, uma declaracao como a
>> seguinte:
>>
>> var
>>   x : ^Integer;
>>
>> significa que a variavel "X" possui dentro de si, o endereco onde um 
>> integer
>> (a informacao) esta localizado na memoria.
>>
>> Por outro lado, a definicao abaixo:
>>
>> var
>>    x : TButton;
>>
>> significa que "x" eh uma referencia, nao um ponteiro, para uma instancia 
>> da
>> class TButton. Qual a diferenca entre referencia de objetos e ponteiros?
>> Ponteiro aponta para onde a informacao esta na memoria. Referencia de
>> objetos eh um endereco que PODE ser o local na memoria onde a informacao
>> esta localizada, como PODE ser o endereco de uma estrutura de memoria que
>> conteria o endereco do botao (TButton). Eh a implementacao da linguagem 
>> que
>> vai determinar se uma referencia de objeto funciona exatamente igual ao
>> conceito de um ponteiro, ou a referencia conteria dentro de si o endereco 
>> de
>> alguma outra coisa. Esta outra coisa seria uma estrutura que conteria o
>> endereco da informacao. Dizer que um objeto eh um ponteiro nao esta
>> totalmente correto. Se for pensar apenas que ponteiros e referencias de
>> objeto, possuem dentro de si enderecos de memoria, entao os conceitos sao
>> iguais. Mas, se formos analisar a semantica da coisa toda, os conceitos 
>> sao
>> diferentes.
>>
>> Resumindo de forma mais simples: Um ponteiro aponta diretamente para a
>> informacao; Uma referencia de objetos, seria um ponteiro de ponteiros.
>>
>> Desculpe pel e-mail tao grande
>
> Clayton,
>
> uma classe é um ponteiro porque aponta para um objeto. Um objeto não é
> ponteiro, objeto é objeto. Você está certo ao dizer que uma classe pode
> apontar para algo que não é exatamente um TButton (citando seu exemplo),
> mas irá apontar para uma estrutura semelhante (uma super-classe de
> TButton), mas aponta, o alvo será um objeto, portanto o seu 'x' será um
> ponteiro.
>
> Eu ainda acabei por não compreender direito o que você quer dizer com
> referência de objetos. Pra mim, dizer 'uma referência a uma instância de
> TButton' é o mesmo que dizer 'um ponteiro para uma instância de TButton'
> (ou seja, para um objeto). Estou utilizando os conceitos do Object Pascal.
>
>
> --
> João Morais
>
>
> -- 
> <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>
>
> Para ver as mensagens antigas, acesse:
> http://br.groups.yahoo.com/group/delphi-br/messages
>
> Para falar com o moderador, envie um e-mail para:
> [EMAIL PROTECTED] ou [EMAIL PROTECTED]
>
> Links do Yahoo! Grupos
>
>
>
>
>
>
>
>
>
>
>
>
> -- 
> No virus found in this incoming message.
> Checked by AVG Anti-Virus.
> Version: 7.0.300 / Virus Database: 266.5.4 - Release Date: 1/3/2005
>
> 



-- 
No virus found in this outgoing message.
Checked by AVG Anti-Virus.
Version: 7.0.300 / Virus Database: 266.5.4 - Release Date: 1/3/2005




-- 
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>

Para ver as mensagens antigas, acesse:
 http://br.groups.yahoo.com/group/delphi-br/messages

Para falar com o moderador, envie um e-mail para:
 [EMAIL PROTECTED] ou [EMAIL PROTECTED]
 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/delphi-br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 



Responder a