C++
Funkcja C ++ „call by value” vs. „call by reference”
Szukaj…
Wprowadzenie
Celem tego rozdziału jest wyjaśnienie różnic w teorii i implementacji tego, co dzieje się z parametrami funkcji po wywołaniu.
Szczegółowo parametry można postrzegać jako zmienne przed wywołaniem funkcji i wewnątrz funkcji, gdzie widoczne zachowanie i dostępność tych zmiennych różni się w zależności od metody użytej do ich przekazania.
Ponadto w tym temacie wyjaśniono możliwość ponownego użycia zmiennych i ich odpowiednich wartości po wywołaniu funkcji.
Zadzwoń według wartości
Po wywołaniu funkcji na stosie programu tworzone są nowe elementy. Obejmują one niektóre informacje o funkcji, a także przestrzeń (lokalizacje pamięci) dla parametrów i zwracaną wartość.
Podczas przekazywania parametru do funkcji wartość użytej zmiennej (lub literału) jest kopiowana do miejsca w pamięci parametru funkcji. Oznacza to, że teraz istnieją dwie lokalizacje pamięci o tej samej wartości. Wewnątrz funkcji pracujemy tylko nad lokalizacją pamięci parametrów.
Po wyjściu z funkcji pamięć na stosie programu jest usuwana (usuwana), co kasuje wszystkie dane wywołania funkcji, w tym miejsce w pamięci parametrów, które zastosowaliśmy w środku. Zatem wartości zmienione wewnątrz funkcji nie wpływają na wartości zmiennych zewnętrznych.
int func(int f, int b) {
//new variables are created and values from the outside copied
//f has a value of 0
//inner_b has a value of 1
f = 1;
//f has a value of 1
b = 2;
//inner_b has a value of 2
return f+b;
}
int main(void) {
int a = 0;
int b = 1; //outer_b
int c;
c = func(a,b);
//the return value is copied to c
//a has a value of 0
//outer_b has a value of 1 <--- outer_b and inner_b are different variables
//c has a value of 3
}
W tym kodzie tworzymy zmienne wewnątrz funkcji głównej. Otrzymują one przypisane wartości. Po wywołaniu funkcji powstają dwie nowe zmienne: f
i inner_b
gdzie b
dzieli nazwę ze zmienną zewnętrzną, nie dzieli lokalizacji pamięci. Zachowanie a<->f
b<->b
jest identyczne.
Poniższa grafika symbolizuje to, co dzieje się na stosie i dlaczego nie zmieniono varibale b
. Grafika nie jest w pełni dokładna, ale podkreśla przykład.
Nazywa się to „call by value”, ponieważ nie przekazujemy zmiennych, a jedynie wartości tych zmiennych.