Java使用对象和原始类型的pass-by-value。因为Java传递了引用的值,所以我们可以更改目标的值但不能更改地址。
这与C ++相比如何?
答案 0 :(得分:8)
区别在于您是否可以影响调用函数中的变量。
让我们把对象搁置一会儿。在纯粹按值传递的Java中,您无法更改传递给被调用函数的变量的调用函数的值。例如:
void foo() {
int a = 42;
bar(a);
System.out.println("foo says: " + a);
}
void bar(int a) {
a = 67;
System.out.println("bar says: " + a);
}
如果您致电foo
,您会看到:
bar says: 67 foo says: 42
bar
无法更改foo
的{{1}}。
如果你通过值传递,那么在C ++中就是如此。但是,如果您通过引用,则会将引用传递给调用代码的变量。这意味着被调用的代码可以改变它:
a
请注意,void foo() {
int a = 42;
bar(a);
cout << "foo says: " << a;
}
void bar(int& a) {
a = 67;
cout << "bar says: " << a;
}
定义为接收引用(bar
)。如果您致电int& a
,则会看到:
bar says: 67 foo says: 67
bar
能够更改bar
内a
的值。
好的,让我们来处理对象引用:首先,请注意“reference”这个词用于两个完全不同的东西:引用到变量在调用函数中(这是传递引用的东西),以及引用到对象。当您将对象引用传递给Java中的方法时,引用将通过 value 传递,就像其他所有内容一样。
foo
所以你看到了:
bar says (after add): 1 bar says (after new): 0 foo says: 1 foo says: same list? true
void foo() {
List list = new ArrayList();
List ref2 = list; // (Let's remember that object reference for later...)
bar(list);
System.out.println("foo says: " + list.size());
System.out.println("foo says: Same list? " + (ref2 == list));
}
void bar(List list) {
// `bar` can modify the state of the object the reference points to
list.add(new Object());
System.out.println("bar says (after add): " + list.size());
// ...but cannot change `foo`'s copy of `list`
list = new ArrayList();
System.out.println("bar says (after new): " + list.size());
}
可以更改传入引用的对象的状态(按值),但不能更改bar
对该对象的引用。 foo
未看到新列表foo
已创建。
答案 1 :(得分:2)
在Java中,您可以按值传递基元和引用。没有其他选择。
在C ++中,您可以按值或引用传递基元和指针。如果通过引用传递,则可以看到在将值或指针传递给方法后对值或指针所做的更改,并且可以更改原始值。
答案 2 :(得分:1)
不同之处在于您是否可以影响调用函数中的变量。
让我们把对象搁置一会儿。在Java中,它纯粹是按值传递,您不能更改传递给被调用函数的变量的调用函数值。例如:
void foo() {
int a = 42;
bar(a);
System.out.println("foo says: " + a);
}
void bar(int a) {
a = 67;
System.out.println("bar says: " + a);
}
如果你打电话给foo,你会看到:
巴尔说:67 foo说:42 酒吧无法改变foo的。如果你通过值传递,那么在C ++中就是如此。但是,如果通过引用传递,则传递对调用代码变量的引用。这意味着被调用的代码可以改变它:
答案 3 :(得分:0)
在C ++中,与此类似的是
void Swap(Type* A, Type* B)
{
// here we have pointers to type A (in Java they are called references and don't use * syntax)
A->DoThis() // can call with -> a method on object
//if you try to swap A with B not possible because we don't have A*/B* reference
// see bellow how to do this
}
在C ++中处理上述限制的方法是
void Swap(Type& A, Type& B)
{
Type& temp = A;
A = B;
B = temp;
}