Skip to content

Latest commit

 

History

History
131 lines (95 loc) · 4.1 KB

05-references.md

File metadata and controls

131 lines (95 loc) · 4.1 KB

Podstawy C++

Referencje

Coders School

&

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

Czym jest referencja?

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 referencje int& 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

Co zyskujemy w ten sposób?

  • 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


Jak przekazać element przez referencję?

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

Zadanie

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

Podsumowanie

  • 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