值参数和参考参数之间的差异?

时间:2010-02-05 12:38:52

标签: oop reference parameters

值参数和参考参数之间的差异?在我的采访中,访谈员有时会问这个问题。有人可以告诉我一个容易用例子解释的确切区别吗?并且参考参数和指针参数是一样的吗?

由于

7 个答案:

答案 0 :(得分:14)

调用者看不到对值参数的更改(也称为“按值传递”)。

调用者可以看到对参考参数的更改(“按引用传递”)。

C ++示例:

void by_value(int n) { n = 42; }
void by_ref(int& n) { n = 42; }

void also_value(int const& n); // Even though a reference is used, this is
// semantically a value parameter---though there are implementation
// artifacts, like not being able to write "n = 42" (it's const) and object
// identity (&n here has different ramifications than for by_value above).

指针的一个用途是实现“引用”参数,而不使用特殊的引用概念,某些语言(如C)没有。 (当然,您也可以将指针视为值本身。)

答案 1 :(得分:8)

主要区别在于是否复制了传递的对象。如果它是一个值参数,编译器必须生成这样的代码,改变函数内部的函数参数对传递的原始对象没有影响,因此它通常会复制该对象。在参考参数的情况下,编译器必须生成这样的代码,所有操作都在传递的原始对象上完成。

答案 2 :(得分:2)

指针是表示引用的低级方式,因此传递指针(按值)是C语言通常如何通过引用语义实现传递。

答案 3 :(得分:2)

我认为此链接可能会对您有所帮助Call by Value and Call by Reference。这家伙详细解释了它是如何工作的。希望能说清楚。

答案 4 :(得分:2)

区别很简单:直接参数按值传递,接收器接收传递的副本;意味着如果接收器修改了参数,这些更改将不会反映回调用者。 (这通常被称为,足够适当,通过价值或通过复制。

答案 5 :(得分:1)

基本上有三种参数;指针,参考和直接。

区别很简单:直接参数按值传递,接收器接收传递的副本;意味着如果接收器修改了参数,这些更改将不会反映回调用者。 (这通常被称为,足够恰当,按值传递,或bycopy

指针也按值传递,但调用者不是发送实际值,而是发送值的地址。这意味着通过遵循此指针,接收器可以修改参数。请注意,对实际指针所做的更改仍然不会反映回调用方。

最终形式,逐个引用,是这两种方法之间的中间立场。从本质上讲,它可以被认为是一个看起来像值的指针。

值得一提的是,在这一切的核心,参数始终通过值传递,但不同的语言有不同的方式来实现引用语义(请参阅Kylotans答案)。

// Example using C
// bycopy
int multiply(int x, int y) {
  return x * y;
}

void multiply_p(int *x, int y) {
  *x *= y;
}


int main () {
  int i, j, k;
  i = 20;
  j = 10;
  k = multiply(i,j); // k is now 200
  multiply_p(&i, k); // i is now 4000 (200 * 20)
  return 0;
}

答案 6 :(得分:0)

伪代码:
通过价值:

void setTo4(value) { // value is passed by value
    value = 4;
}

int x = 1;
setTo4(x);
// x is still 1

通过参考:

void setTo4(value) { // value is passed by reference
    value = 4;
}

int x = 1;
setTo4(x);
// x is 4