Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Peixoto

Uso de referências em funções C++

Recommended Posts

:natalohmy:

 

Considere o programa e as afirmações abaixo:

 

#include <iostream>
#include <cstdlib>
using namespace std;
int incremento (int v);

int main()
{
  int i;

i=incremento(3);
cout << i << endl;
 system ("pause");
return 0;
}

int incremento (int v)
{
  int &refv=v;
 refv++;

return (refv +2);
}

 

É dito que para se usar referências em funções é preciso:

 

a- a variável utilizada, creio que a de referência, ser static – NÃO usei e não deu erro.

 

b- Não se pode usar constantes (const) com referências - OK deu erro.

 

c- Não se pode retornar expressões com referência; retornei e NÃO deu erro.

 

Estou interpretando errado alguma coisa ? por que o programa não reflete todas as afirmações ?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Essas frases se referem a outras aplicações. A primeira não tinha ouvido falar, então não posso dizer, pra mim isso não existe.

 

A segunda, é porque normalmente constantes são armazenadas num lugar em que não se pode fazer referências. Agora, sobre a terceira, pode em alguns casos, quando você retorna a referência para uma variável que não existe mais. Então, não é um erro mesmo, mas sim boas práticas, pois pode causar problemas.

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que outras aplicações ? este seria um tópico impotante ou pode ser deixado de lado ? pergunto isto, pois você classificou as frasses como, apenas, boa prática de programação, e não um assundo da kinguagem.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

A única aplicação útil de referência é referenciar variáveis em funções.

 

Por exemplo, ao invés de o sistema copiar uma struct de 120 bytes, talvez valha a pena pegar só os 4bytes do endereço (8, em SO's de 64bits), o que é mais rápido. Aí você faz isso usando ponteiros ou referências. A referência vai fazer que só copie o endereço da variável, não ela toda, proporcionando um ganho de desempenho em variáveis grandes, principalmente classes / structs.

 

Por exemplo:

 

struct some_struct
{
  int x, y, z, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w;
};

int func( struct some_struct &arg )
{
   return some_struct.x;
}

int main( void )
{
   struct some_struct my_struct;
   my_struct.x = 5;

   func(my_struct);

   return 0;
}

 

Esse código mostra a vantagem de usar referência. Ao invés de copiar 4 * (nº de letras no alfabeto) bytes, a função func() só copia 4 em ambientes de 32bits e 8 em ambients de 64bits (o tamanho dos ponteiros nessas arquiteturas). Assim, fica mais rápido, pois tem que copiar menos dados, e menos resource-intensive, pois gasta menos dados.

 

Então, o problema é que se você passar uma referência que no momento em que a função é chamada ela apontar para um valor não existente mais, acontecerá undefined behaviour (se não estou enganado).

 

Eu só estou com dificuldades de pensar em um exemplo pra te mostrar, devem ter toneladas na internet, procura aê ^^

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

:natalohmy:

 

Ok,

 

Mas como estamos falando de C++, não parece ter sentido falar em estruturas. Funções com struct são supridas com funções-membro de classe. Daí a pergunta: Como ficaria seu exemplo e argumento para uma função de classe, ou até uma função “solta” ?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Também vale para classes, por exemplo. Embora não seja muito comum. Outro exemplo seria o uso de long double em SO's de 64 bits e de double em SO's de 32 bits. Eles normalmente tem o tamanho de 16bits e 8bits, respectivamente, valendo a pena usar os respectivos ponteiros de 8bits e 4bits, respectivamente.

 

Outro exemplo é quando passamos vetores. Tipo, nós passamos uma string pelo ponteiro da mesma, o que é uma forma de referência, e não pela cópia do vetor em si, imagina ter que copiar um vetor de caracteres com 382 caracteres! Você não vai copiar 383bits, mas sim só 4 (ou 8).

 

Agora, eu estive falando o tempo todo do uso para otimizações. Também há usos para quando queremos modificar o valor de um dos parâmetros para que a modificação aconteça fora da função.

 

Por exemplo, uma função que soma 10 pode ser escrita de 2 formas:

 

#include <iostream>

int sumMode1(const int value);
void sumMode2(int &value);
void sumMode3(int *value); // Modo da C para referência

int main( void )
{
   int teste1 = 0, teste2 = 0, teste3 = 0;

   teste1 = sumMode1(teste1);
   sumMode2(teste2);
   sumMode3(&teste3); // Feio colocar o operador de endereço, não?

   std::cout << "teste1: " << teste1 << std::endl
             << "teste2: " << teste2 << std::endl
             << "teste3: " << teste3 << std::endl;

   return 0;
}

int sumMode1( const int value )
{
   return value += 10;
}

void sumMode2( int &value )
{
   value += 10;
}

void sumMode3( int *value )
{
   *value += 10; // Estamos usando ponteiros aqui, então temos que pegar o valor em si, e não o endereço.
}

 

Esse exemplo mostra o quão importante é para fins de documentação e prevenção de erros colocar um "const" antes de qualquer parâmetro que você não vai modificar. Assim, além de te ajudar a prevenir modificações sem querer, é uma forma de mostrar ao usuário da função que não vai modificar o valor em hipótese alguma (embora, em referência, isso nunca fosse acontecer, porque o parãmetro é copiado na função, é boa prática).

 

Não testei esse exemplo para erros, mas os 3 devem mostrar 10. Se não mostram foi erro meu ^^

 

Esse exemplo mostra o principal uso de referência, modificar um valor fora da função que é passado como parâmetro (esqueci de te falar antes ^^)

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.