Magiczny znaczek &
(ampersand) oznacza referencję.
int value = 5;
int & number = value;
Powyższy zapis oznacza zmienną number
typu int&
, czyli referencję na typ int
.
Nie ma znaczenia, czy referencję dokleimy do typu, czy nazwy zmiennej, ale referencja jest oddzielnym typem, więc sugerujemy nie doklejać jej do nazwy zmiennej.
int& number = value; // lewak
int &number = value; // prawak (odradzane)
int & number = value; // neutralny
Spójrzmy na fragment kodu.
int number = 5;
int& reference = number;
std::cout << reference << '\n'; // 5
std::cout << ++reference << "\n"; // 6
std::cout << number << "\n"; // 6
- Referencja odwołuje się do istniejącego obiektu
-
Jeżeli utworzymy obiekt
int value
to poprzez referencjeint& reference = value
będziemy mogli się do niego bezpośrednio odwoływać. - Referencja to inna, dodatkowa nazwa dla tej samej zmiennej (alias)
- Modyfikacja referencji = modyfikacja oryginalnego obiektu
-
Nie musimy kopiować elementów. Wystarczy, że przekażemy referencje.
- W ten sposób możemy swobodnie w wielu miejscach programu odczytywać wartość tej zmiennej, bez zbędnego jej kopiowania.
- Referencja zajmuje w pamięci tyle, ile zajmuje adres (4 lub 8 bajtów).
-
Tworzenie referencji do typu
int
(zazwyczaj 4 bajty) nie zawsze ma sens optymalizacyjny, chyba, że chcemy zmodyfikować ten element wewnątrz funkcji. - Przekazywanie argumentów przez referencje nabierze więcej sensu, kiedy poznamy już klasy i obiekty :)
Ile miejsca zajmuje referencja? - stackoverflow.com
void foo(int& num) {
std::cout << num; // good
num += 2; // good
}
Jeśli chcemy mieć pewność, że funkcja nie zmodyfikuje nam wartości (chcemy ją przekazać tylko do odczytu) dodajemy const
.
void bar(const int& num) {
std::cout << num; // good
num += 2; // compilation error, num is const reference
}
Wywołanie funkcji to po prostu:
int num = 5;
foo(num);
bar(num);
Zaimplementuj funkcję modifyString()
. Ma ona przyjąć i zmodyfikować przekazany tekst. Na ekranie chcemy zobaczyć "Other string"
. Pobierz zadanie
#include <iostream>
#include <string>
// TODO: Implement modifyString()
// It should modify passed string to text "Other string"
int main() {
std::string str{"Some string"};
modifyString(str);
std::cout << str << '\n';
return 0;
}
- referencja jest aliasem (inną nazwą dla zmiennej)
- modyfikacja referencji to modyfikacja oryginalnego obiektu
-
przy przekazywaniu parametru przez referencję:
- unikamy zbędnych kopii
- modyfikacja obiektu będzie skutkowała zmodyfikowaniem oryginału przekazanego do funkcji