Ten artykuł nie jest skończony. Możesz pomóc w jego ukończeniu edytując tą stronę.
Referencje
W tej lekcji pokażę Ci, w jaki sposób możesz pośrednio odwoływać się do zmiennych poprzez referencje.
Motywacja
Wyobraź sobie, że chcesz napisać funkcję, która podwaja przekazany jej argument.
#include <iostream>
void double_number(int num)
{
num = num * 2;
}
int main()
{
int x = 5;
double_number(x);
std::cout << x;
}
5
Niestety to nie zadziała, ponieważ do parametru num
została zapisana jedynie wartość x
.
Tutaj do gry wchodzą referencje.
Używanie referencji
Możesz utworzyć referencję dodając &
do typu zmiennej, do której chcesz referować.
int var = 5;
int& ref = x; // ref jest referencją, odwołującą się do var
Teraz, jeśli zmodyfikujesz ref
, var
także ulegnie zmianie, ponieważ ref
jest var
.
Przekazywanie argumentów przez referencje
Sprawdźmy, w jaki sposób możemy wykorzystać referencję, aby rozwiązać nasz problem.
Musimy sprawić, aby funkcja przyjmowała jako argument referencję do zmiennej typu int
zamiast int
.
#include <iostream>
void double_number(int &num)
{
num = num * 2;
}
int main()
{
int x = 5;
double_number(x);
}
10
Teraz kiedy funkcja double_number
przyjmuje referencję, num
stanie się zmienną przekazaną do funkcji. Oznacza to, że jeśli zmodyfikujemy num
(który stał się x
), x
także ulegnie zmianie.
Zwróć uwagę, że znak &
przy tworzeniu referencji został umieszczony raz przy nazwie typu (int&
), a raz przy nazwie zmiennej (&num
). Oba te zapisy są poprawne i oznaczają to samo.
Modyfikacja elementów w pętli ranged-based for
Na podobny problem możesz się natknąć podczas korzystania z range-based for. Ponieważ referencje stają się zmiennymi do których się odwołują, to możemy ich użyć aby uzyskać dostęp do elementów w tablicy.
Oto prosta tablica:
std::vector<int> arr = {2, 4, 6};
Załóżmy, że chcemy dodać 5 do każdego elementu. Możemy to zrobić odwołując się do każdego elementu osobno, ale przy dużych tablicach staje się to kłopotliwe.
Więc pętle przybędą nam z pomocą!
for (int x : arr)
{
x = x + 5;
}
std::cout << arr[0];
2
Niestety, ale powyższy kod nie zadziała, ponieważ do x
trafia jedynie kopia elementu, a nie on sam.
W tym miejscu możemy skorzystać z referencji, aby do zmiennej x
przekopiować element, a nie jedynie jego wartość.
for (int& x : arr)
{
x = x + 5;
}
std::cout << arr[0];
7
Teraz każdy element tablicy został powiększony o 5.
Korzystaj z referencji jeśli chcesz zmodyfikować zmienną. Nie używaj referencji jeśli potrzebujesz tylko wartości.