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 &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;
}

 

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.