Hva er forskjellen mellom
Kan du gi meg noen eksempler?
Det er en måte å sende argumenter til funksjoner på. Overføring av referanse betyr at den kalte funksjonens parameter vil være den samme som den som kaller den (ikke verdien, men identiteten - selve variabelen). Overføring av verdi betyr at den kalte funksjonens parameter vil være en kopi av anroperens overførte argument. Verdien vil være den samme, men identiteten - variabelen - er forskjellig. Dermed endrer endringer i en parameter utført av den kalte funksjonen i ett tilfelle argumentet som er sendt, og i det andre tilfellet endrer bare verdien av parameteren i den kalte funksjonen (som bare er en kopi). I en rask hast:
ref
brukt hos caller og kalt funksjon). Jon Skeet har også en fin forklaring på dette her.Koder
Siden språket mitt er C++, vil jeg bruke det her
// passes a pointer (called reference in java) to an integer
void call_by_value(int *p) { // :1
p = NULL;
}
// passes an integer
void call_by_value(int p) { // :2
p = 42;
}
// passes an integer by reference
void call_by_reference(int & p) { // :3
p = 42;
}
// this is the java style of passing references. NULL is called "null" there.
void call_by_value_special(int *p) { // :4
*p = 10; // changes what p points to ("what p references" in java)
// only changes the value of the parameter, but *not* of
// the argument passed by the caller. thus it's pass-by-value:
p = NULL;
}
int main() {
int value = 10;
int * pointer = &value;
call_by_value(pointer); // :1
assert(pointer == &value); // pointer was copied
call_by_value(value); // :2
assert(value == 10); // value was copied
call_by_reference(value); // :3
assert(value == 42); // value was passed by reference
call_by_value_special(pointer); // :4
// pointer was copied but what pointer references was changed.
assert(value == 10 && pointer == &value);
}
Og et eksempel i Java vil ikke skade:
class Example {
int value = 0;
// similar to :4 case in the c++ example
static void accept_reference(Example e) { // :1
e.value++; // will change the referenced object
e = null; // will only change the parameter
}
// similar to the :2 case in the c++ example
static void accept_primitive(int v) { // :2
v++; // will only change the parameter
}
public static void main(String... args) {
int value = 0;
Example ref = new Example(); // reference
// note what we pass is the reference, not the object. we can't
// pass objects. The reference is copied (pass-by-value).
accept_reference(ref); // :1
assert ref != null && ref.value == 1;
// the primitive int variable is copied
accept_primitive(value); // :2
assert value == 0;
}
}
Wikipedia
http://en.wikipedia.org/wiki/Pass_by_reference#Call_by_value
http://en.wikipedia.org/wiki/Pass_by_reference#Call_by_reference
Denne fyren nailer det ganske mye:
Her er et eksempel:
#include <iostream>
void by_val(int arg) { arg += 2; }
void by_ref(int&arg) { arg += 2; }
int main()
{
int x = 0;
by_val(x); std::cout << x << std::endl; // prints 0
by_ref(x); std::cout << x << std::endl; // prints 2
int y = 0;
by_ref(y); std::cout << y << std::endl; // prints 2
by_val(y); std::cout << y << std::endl; // prints 2
}
Når du sender med ref, sender du i utgangspunktet en peker til variabelen. Pass by value sender du en kopi av variabelen. I grunnleggende bruk betyr dette normalt at pass by ref endringer i variabelen vil bli sett være den kalende metoden og pass by value vil de ikke.