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; // neutralnySpó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 valueto poprzez referencjeint& reference = valuebę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