【问题标题】:Difference between value parameter and reference parameter?值参数和参考参数的区别?
【发布时间】:2010-02-05 12:38:52
【问题描述】:

值参数和参考参数的区别?在我的面试中,面试官有时会问这个问题。有人能告诉我用例子很容易解释的确切区别吗?并且引用参数和指针参数是一样的吗?

谢谢

【问题讨论】:

  • @Gyom:提到回答这个问题的网站、书籍、重复问题或其他参考资料是在 Stack Overflow 上正确的说法,它试图 成为 TFM .
  • 是的。你知道它在一个地方提供了来自优秀开发人员的关于我的问题的最新更新。您只需要刷新页面。有没有办法自动刷新浏览器?
  • @Naveed:尝试在SuperUser.com 上询问。 :P(或者搜索它已经问过。)
  • @Roger Pate:是的,我应该添加 STFW :-) en.wikipedia.org/wiki/Evaluation_strategy#Call_by_value

标签: oop reference parameters


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    对引用参数的更改对调用者可见(“按引用传递”)。

    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)没有这种概念。 (当然你也可以把指针当作值本身。)

    【讨论】:

    • 或者在包含示例之前更短。 :)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        参数基本上分为三种;指针、引用和直接。

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

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

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

        值得一提的是,在这一切的核心,参数总是按值传递,但不同的语言有不同的引用语义实现方式(参见 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】:

          伪代码:
          按值传递:

          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
          

          【讨论】:

          • void setTo4(value) 和 void setTo4(value) 有什么区别。引用传递示例函数不应该是 void setTo4(ref int value) 吗?
          • 它是伪代码,不适用特定语言的语法。他没有提到任何语言,一些语言默认通过引用传递,其他语言通过值传递。请注意,我没有为 setTo4 指定参数的类型,因此它也可能是通过引用传递的对象。这是一个示例,而不是特定于语言的实现。
          猜你喜欢
          • 1970-01-01
          • 2010-09-23
          • 2019-07-21
          • 2023-03-03
          相关资源
          最近更新 更多