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). Zatem co zrobić w sytuacji, gdy potrzebujemy tych wartości więcej?

referencje

Jednym ze sposobów uporania się z tym problemem jest wykorzystanie referencji.

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

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

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

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

Przykład 1

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

Rozwiązanie bez użycia referencji

#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;

	return 0;
}

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

referencje

Rozwiązanie z wykorzystaniem referencji:

#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;

	return 0;
}

referencje

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

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