Programowanie i algorytmy

Funkcje a referencje

powrót

Jak już wspominałem w poprzednich artykułach, funkcje w C++ mogą zwracać co najwyżej jedną wartość, która może posłużyć dalszej obróbce (wartość zwrotna funkcji), ale co jeśli tych wartości potrzebujemy więcej? Jednym ze sposobów uporania się z tym problemem jest wykorzystanie referencji.

Pamiętamy, że w chwili przykazywania danych do funkcji tworzone są ich kopie w pamięci, czego konsekwencją jest to, że każda zmiana na wartościach tych zmiennych nie będzie "widziana" w miejscu, w którym tą funkcję wywołaliśmy.

Referencje powodują, że w chwili przekazywania argumentów,  pracujemy na oryginałach zmiennych, ponieważ przekazujemy adresy naszych argumentów.

Aby przekazać referencję, należy dodać po nazwie typu znak "&" np.:

void funkcja(char &a, int &b);

Rozpatrzmy zadanie polegające na zamianie wartości dwóch zmiennych.

 

Zróbmy najpierw to zadanie bez referencji:

#include <cstdlib>
#include <iostream>
 
using namespace std;
 
void zamiana(int a,int b)
{
  int temp = a;
  a = b;
  b = temp;
}
 
int main()
{
  int a, b;
 
  cout<<"Podaj dwie liczby: ";
  cin>>a>>b;
  cout<<"Przed zamiana: a = "<<a<<", b = "<<b<<endl;
 
  zamiana(a,b);
 
  cout<<"Po zamianie: a = "<<a<<", b = "<<b<<endl;
 
  system("pause");
  return 0;
}

 

Oczywiście efekt nie będzie zadowalający:

referencje

 

No i program z wykorzystaniem referencji:

#include <cstdlib>
#include <iostream>
 
using namespace std;
 
void zamiana(int &amp;a,int &amp;b)
{
  int temp = a;
  a = b;
  b = temp;
}
 
 
int main()
{
  int a, b;
 
  cout<<"Podaj dwie liczby: ";
  cin>>a>>b;
  cout<<"Przed zamiana: a = "<<a<<", b = "<<b<<endl;
 
  zamiana(a,b);
  cout<<"Po zamianie: a = "<<a<<", b = "<<b<<endl;
 
system("pause");
return 0;
}

 

referencje

 

Tu widzimy, że funkcja spełnia kryteria zadania.

Warto wspomnieć, że podobne działanie uzyskamy w przypadku przekazania argumentów funkcji za pomocą wskaźników.