Kakšna je razlika med
Ali mi lahko navedete nekaj primerov, prosim?
To je način za posredovanje argumentov funkcijam. Posredovanje z referenco pomeni, da bo parameter klicane funkcije enak klicateljevemu posredovanemu argumentu (ne vrednost, temveč identiteta - sama spremenljivka). Podajanje z vrednostjo pomeni, da bo parameter klicane funkcije kopija klicateljevega posredovanega argumenta. Vrednost bo enaka, vendar je identiteta - spremenljivka - drugačna. Tako spremembe parametra, ki jih opravi klicana funkcija, v enem primeru spremenijo posredovani argument, v drugem primeru pa samo spremenijo vrednost parametra v klicani funkciji (ki je samo kopija). V naglici:
ref
se uporablja pri klicatelju in klicani funkciji). Jon Skeet ima tudi lepo razlago o tem tukaj.Kode
Ker je moj jezik C++, ga bom uporabil tukaj
// 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);
}
In primer v Javi ne bo škodil:
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;
}
}
Wikipedija
http://en.wikipedia.org/wiki/Pass_by_reference#Call_by_value
http://en.wikipedia.org/wiki/Pass_by_reference#Call_by_reference
Ta fant je v bistvu točno določen:
Tukaj je primer:
#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
}
Pri posredovanju z ref pravzaprav posredujete kazalec na spremenljivko. Pri posredovanju z vrednostjo posredujete kopijo spremenljivke. Pri osnovni uporabi to običajno pomeni, da bodo spremembe spremenljivke pri posredovanju z oznako ref vidne metodi, ki kliče, pri posredovanju z vrednostjo pa ne.