0Pricing
C++ Academy · Lekcja

Przekazywanie przez wartość a przez referencję

Porównaj różnice semantyczne i wydajnościowe między przekazywaniem przez wartość a przez referencję

Przekazywanie przez wartość a przez referencję to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.

Podsumowanie przekazywania przez wartość

Gdy argument jest przekazywany przez wartość, funkcja otrzymuje jego kopię. Zmiany wewnątrz funkcji nie wpływają na kod wywołujący.

void increment(int x) {
    x++;          // modifies the copy
}

int n = 5;
increment(n);
std::cout << n;   // still 5

Przekazywanie przez referencję

Argument należy przekazywać przez referencję, używając & na liście parametrów. Funkcja pracuje bezpośrednio na zmiennej kodu wywołującego.

void increment(int& x) {
    x++;
}

int n = 5;
increment(n);
std::cout << n;   // now 6

Dlaczego przekazywać przez referencję

Dwa powody:

  • Unikanie kopiowania dużych obiektów (wydajność)
  • Modyfikowanie zmiennej kodu wywołującego (semantyka)

Referencja const: najlepsze cechy obu rozwiązań

Referencja const pozwala uniknąć kopiowania, nie dając funkcji prawa do modyfikowania obiektu. Należy jej używać dla nietrywialnych parametrów wejściowych.

void printName(const std::string& name) {
    std::cout << name;
}

Praktyczne zasady

W przypadku parametrów funkcji:

  • Typ tani do kopiowania (int, double, wskaźnik) → przekazywanie przez wartość
  • Typ kosztowny do kopiowania i tylko do odczytu → const T&
  • Funkcja modyfikuje dane kodu wywołującego → T&

Przekazywanie przez wskaźnik

Wskaźniki również pozwalają modyfikować zmienną kodu wywołującego, ale kod wywołujący musi jawnie pobrać jej adres za pomocą &, dzięki czemu intencja jest widoczna.

void increment(int* x) {
    (*x)++;
}

int n = 5;
increment(&n);

Parametr będący referencją a parametr będący wskaźnikiem

Referencje są wygodniejsze, gdy wartość jest zawsze wymagana. Wskaźniki są odpowiednie, gdy argument jest opcjonalny — aby go pominąć, należy przekazać nullptr.

Zwracanie przez wartość

Zwracanie przez wartość jest domyślnym rozwiązaniem. Dzięki RVO (optymalizacji zwracanej wartości) i semantyce przenoszenia jest ono zazwyczaj równie szybkie jak zwracanie przez referencję, a przy tym bezpieczniejsze.

Zwracanie przez referencję

Referencję należy zwracać, gdy funkcja zwraca istniejący obiekt, którego czas życia wykracza poza wywołanie (na przykład składową kontenera). Nigdy nie należy zwracać referencji do zmiennej lokalnej.

Łączenie różnych sposobów przekazywania w szablonach

Szablony często używają referencji uniwersalnych (T&&) oraz std::forward, aby zachować kategorie wartości. Omówimy to w kursie dotyczącym semantyki przenoszenia.

Częsty błąd: slicing

Klasy pochodne należy przekazywać przez referencję (lub wskaźnik) do parametru typu bazowego. Przekazywanie przez wartość odcina pochodną część obiektu.

class Base { /* virtual */ };
class Derived : public Base { /* members */ };

void takeByValue(Base b);    // SLICES Derived!
void takeByRef(Base& b);     // OK

Szybkie sprawdzenie

Jak należy przekazać duży obiekt std::string, z którego funkcja tylko odczytuje dane?

Podsumowanie

Przekazywanie przez wartość kopiuje obiekt, a przekazywanie przez referencję współdzieli go. Dla dużych obiektów tylko do odczytu należy używać const T&, T& — gdy funkcja modyfikuje dane kodu wywołującego, a małe typy wbudowane należy przekazywać przez wartość.

Często zadawane pytania

Czy lekcja „Przekazywanie przez wartość a przez referencję” jest bezpłatna?

Tak — pełny tekst „Przekazywanie przez wartość a przez referencję” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Przekazywanie przez wartość a przez referencję”?

Porównaj różnice semantyczne i wydajnościowe między przekazywaniem przez wartość a przez referencję Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C++ Academy?

Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Przekazywanie przez wartość a przez referencję”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?

Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Dlaczego referencje są aliasami zmiennych
  2. Przekazywanie przez wartość a przez referencję
  3. Referencje const i kiedy ich używać
  4. Czas życia referencji i wiszące referencje
← Powrót do C++ Academy