比较Java pass-by-value与C ++ pass-by-value或-reference

时间:2012-11-22 14:51:24

标签: java c++

Java使用对象和原始类型的pass-by-value。因为Java传递了引用的值,所以我们可以更改目标的值但不能更改地址。

这与C ++相比如何?

4 个答案:

答案 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能够更改bara

好的,让我们来处理对象引用:首先,请注意“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;
}