Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Localhost

Referências

Mensagens Recomendadas

Localhost

Olá! O que são referências não consigo perceber muito bem. Sei que são tipo sinónimos das variáveis a que se referem mas não sei ao certo o que contêm.

Por que é que por exemplo quando aplico a clássica função de trocar os valores de variáveis elas trocam? Isso significa que as referências contêm na verdade os endereços das variáveis, certo?

#include <iostream>
using namespace std;

void Swap(int &, int &);

int main() {
int iCode1 = 10;
int iCode2 = 20;
int &rCode1 = iCode1;
int &rCode2 = iCode2;
cout << "Valores antes da troca:\n";
cout << "rCode1: " << rCode1 << endl;
cout << "rCode2: " << rCode2 << endl << endl;
Swap(rCode1,rCode2);
cout << "Valores depois da troca:\n";
cout << "rCode1: " << rCode1 << endl;
cout << "rCode2: " << rCode2 << endl;
return 0;
}

void Swap(int &iNum1, int &iNum2) {
int iTemp = iNum1;
iNum1 = iNum2;
iNum2 = iTemp;
}

Não consigo perceber isto. Obrigado desde já, cumps.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TheDark

Uma referência é só um apontador com semântica de variável. É açúcar sintáctico de C++. Tudo o que podes fazer com referências, também podes fazer com apontadores. Simplifica é coisas como ter que desreferenciar para alterar o valor da memória apontada.


Desaparecido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mogers

Este artigo parece focar o essencial. Alterar uma referência é o mesmo que alterar a própria variável.

A meu ver, um dos pontos mais positivos é permitir a escrita de código mais limpo comparando com o uso de apontadores. Mas também pode ser usado para outras coisas, exemplo:

int table[100][100][100][100];

int go(int index, int x , int y , int z) {
    if (table[index][x][y][y] != -1 )
         return table[index][x][y][y];

    table[index][x][y][y] = 0 ;
    for (int i = 0 ; i < index ; i++)
         table[index][x][y][y] = max( table[index][x][y][y] , table[index-1][x][y][y] );
    return table[index][x][y][y];
}

// vs
int go(int index, int x , int y , int z) {
    int & val = table[index][x][y][y];
    if (val != -1 )
         return val;

    val = 0 ;
    for (int i = 0 ; i < index ; i++)
         val = max( val , table[index-1][x][y][y] );
    return val;
}

PS: só para tornar uma coisa clara: o TheDark disse (e bem, tanto quanto sei) "Tudo o que podes fazer com referências, também podes fazer com apontadores", mas o contrário não é verdade! As referências não fazem tudo o que os apontadores fazem (ver artigo que indiquei).


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Já começo a perceber a ideia melhor. Então quando nós temos uma variável que está referenciada essa variável pode ser alterada pela referência onde quer que a última esteja? É isso? Daí poder-se alterar os valores noutras funções.

Isto do C++ está a dar cabo de mim. Principalmente o paradigma de OOP. É complicado para quem veio de C  :P


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TheDark

PS: só para tornar uma coisa clara: o TheDark disse (e bem, tanto quanto sei) "Tudo o que podes fazer com referências, também podes fazer com apontadores", mas o contrário não é verdade! As referências não fazem tudo o que os apontadores fazem (ver artigo que indiquei).

lol, estava a pensar nisso quando escrevi aquilo... ::P

Já começo a perceber a ideia melhor. Então quando nós temos uma variável que está referenciada essa variável pode ser alterada pela referência onde quer que a última esteja? É isso? Daí poder-se alterar os valores noutras funções.

Para mim, facilita imenso pensar em referências como apontadores disfarçados e limitados. Disfarçados porque evitas a desreferenciação e utilizas ponto em vez de -> para aceder aos seus campos, e limitados porque, como o mogers disse, há certas coisas que não podes fazer com referências, como alterar o sítio para onde aponta.


Desaparecido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Sim, já percebi isto! Se re-atribuires alguma variável à referência o que vai acontecer é que a variável que ela referencia vai receber o valor que re-atribuiste.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.