两者有什么区别

引用传递的参数 参数通过value?

你能给我举几个例子吗?


当前回答

看看这张照片:

在第一种情况下(通过引用传递),当变量在函数内部设置或更改时,外部变量也会更改。

但在第二种情况下(按值传递),改变函数内部的变量不会对外部变量产生任何影响。

要阅读这篇文章,请参见这个链接。

其他回答

在理解这两个术语之前,您必须了解以下内容。每一个物体都有两个可以使它被区分的东西。

它的价值。 它的地址。

如果你说employee。name = "John",要知道关于name有两件事。它的值是“John”,它在内存中的位置是一个十六进制数,可能像这样:0x7fd5d258dd00。

根据语言的体系结构或对象的类型(类、结构等),可以传输“John”或0x7fd5d258dd00

传递“John”称为按值传递。

传递0x7fd5d258dd00称为引用传递。任何指向这个内存位置的人都可以访问“John”的值。

有关这方面的更多信息,我建议您阅读有关取消指针引用的内容,以及为什么选择struct(值类型)而不是类(引用类型)。

最简单的方法是在Excel文件中获取。举个例子,有两个数字,5和2分别在A1和B1单元格中,你想在第三个单元格中求出它们的和,假设是A2。

有两种方法可以做到这一点。

通过在单元格中输入= 5 + 2将它们的值传递给单元格A2。在这种情况下,如果单元格A1或B1的值发生变化,则A2中的总和保持不变。 或者通过输入= A1 + B1将单元格A1和B1的“引用”传递给单元格A2。在这种情况下,如果单元格A1或B1的值发生变化,A2中的总和也会发生变化。

“按值传递”将发送存储在指定变量中的数据的副本,“按引用传递”将发送到变量本身的直接链接。

因此,如果你通过引用传递一个变量,然后改变你传递给它的块中的变量,原始变量将被改变。如果只是按值传递,原始变量将不能被传递到的块所改变,但您将获得调用时它所包含的任何内容的副本。

1. 按值传递/按值调用

   void printvalue(int x) 
   {
       x = x + 1 ;
       cout << x ;  // 6
   }

   int x = 5;
   printvalue(x);
   cout << x;    // 5

在按值调用中,当你将一个值传递给printvalue(x)时,即参数5,它被复制为void printvalue(int x)。现在,我们有两个不同的值5和复制的值5,这两个值存储在不同的内存位置。因此,如果你在void printvalue(int x)内做了任何更改,它不会反射回实参。

2. 引用传递/引用调用

   void printvalue(int &x) 
   {
      x = x + 1 ;
      cout << x ; // 6
   }

   int x = 5;
   printvalue(x);
   cout << x;   // 6

在引用调用中,只有一个区别。我们使用&,即地址操作符。通过做 Void printvalue(int &x)我们引用的是x的地址,这告诉我们它指向相同的位置。因此,在函数内部所做的任何更改都会在函数外部反映出来。

既然你来了,你也应该知道……

3.按指针传递/按地址调用

   void printvalue(int* x) 
   {
      *x = *x + 1 ;
      cout << *x ; // 6
   }

   int x = 5;
   printvalue(&x);
   cout << x;   // 6

在传递地址中,指针int* x保存传递给它的地址printvalue(&x)。因此,在函数内部所做的任何更改都会在函数外部反映出来。

例子:

class Dog 
{ 
public:
    barkAt( const std::string& pOtherDog ); // const reference
    barkAt( std::string pOtherDog ); // value
};

Const &通常是最好的。你不会受到建造和破坏的惩罚。如果引用不是const,你的接口暗示它将改变传入的数据。