-4

抱歉,如果问题非常基本。

方案 1:

#include <iostream>
using namespace std;

int   max(int &a)
{
   a +=100;
   return a;
}

int main ( int argc, char ** argv)
{

  int x=20;
  int y;
  y = max(x);
  cout <<"x , y value is  "<<x<<"and"<<y<<endl;
 }

输出:

x,y 值为 120 和 120

方案 2:

#include <iostream>
using namespace std;

int & max(int &a)
{
   a +=100;
   return a;
}

int main ( int argc, char ** argv)
{

  int x=20;
  int y;
  y = max(x);
  cout <<"x , y value is  "<<x<<"and"<<y<<endl;
 }

输出:

x,y 值为 120 和 120

PROGRAM1 和 PROGRAM2 之间的唯一区别是第二个程序通过引用返回。究竟有什么区别?

4

6 回答 6

1

PROGRAM1: 返回时复制引用的变量 a,
PROGRAM2: 返回对被引用变量本身的引用(实际上是相同的引用?)。

输出不会有任何差异,因为无论哪种方式,该值都被复制到变量“y”。

但是, ThePROGRAM1执行的复制操作PROGRAM2.

当您喜欢时会出现问题:

int&  max(int a) // a is  value variable
{
   a +=100;
   int &a1 = a
   return a1;  // you are returning reference to  local 
}

在此版本中,max()变量a范围是 max() 本地的,如果您返回对a. 然后堆栈分配的我会消失,你什么都没有提到。错误的!

在这里阅读更多解释

于 2013-03-01T14:31:32.880 回答
0

据我所知,这两个程序完全一样。您没有复制正确的代码吗?通常,当您通过引用传递变量时,您正在对原始变量进行更改。当您按值传递它时,您传递的是变量的副本。这意味着,如果您通过引用传递变量并对其进行更改,则原始变量也会更改。按值传递时并非如此。

于 2013-03-01T14:43:05.540 回答
0

据我了解,按值返回会创建一个新变量,按引用返回会返回对原始变量的引用,从而节省内存分配。

对于整数,差异可能是学术性的,因为引用将占用与值整数相同的内存空间。

于 2013-03-01T14:31:32.977 回答
0

这两个程序没有问题。仅当您通过引用返回函数的局部变量时才会出现此问题。这是因为该引用将在函数结束时消失。但是当你使用a它时,它仍然会在函数调用之后在作用域内。

于 2013-03-01T14:28:21.743 回答
0

如果您返回一个局部变量的值,则第二个将不正确。但是这些变体之间的区别只是第二个中的函数max返回在其中修改的原始对象。第一个呢 - 它在修改后返回原始值的副本。

因此,如果您使用另一种充满字段而不是 int 的大型类型,则最好使用第二种。

于 2013-03-01T14:35:28.913 回答
0

你的两个程序的唯一区别是值x被复制x到另一个地方[在实际代码中,它可能根本没有任何区别,因为编译器优化掉了“不必要的”副本] .

在您的第一个函数中,axin main 的别名,当它被复制return a;到函数的返回值中时[在 x86 中,这将是eax寄存器,对于我知道它们如何工作的所有编译器变体]。所以我们返回一个值的副本x

在第二个示例中,x应用了相同的别名,但我们返回“别名”,实际上,可以读取代码:

   int y;
   max(x);
   y = x;

就这段代码的目的而言,它确实没有什么区别,但如果你有这样的事情:

int &max(int &x, int &x)
{
    if (x > y) return x;
    return y;
}


int main()
{
   int a = 10;
   int b = 13;

   int& c = max(a, b);

   c = 12;

   cout << "a=" << a << " b=" << b << " c=" << c;
}

现在我们应该看到b被赋予了 的值12,因为c它变成了 的别名b

于 2013-03-01T14:36:11.983 回答