以引用方式返回

时间:2013-03-01 14:22:57

标签: c++

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

计划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之间的唯一区别是第二个程序通过引用返回。究竟有什么区别?

6 个答案:

答案 0 :(得分:1)

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

输出没有区别,因为无论如何将值复制到变量'y'。

但是,PROGRAM1执行一次复制操作而不是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 。然后堆栈分配我会离开,你指的是什么。错误!

宣读更多explanation here

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

所以,如果您使用的是另一个充满字段而不是int的大型类型,那么最好使用第二个类型。

答案 4 :(得分:0)

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

在你的第一个函数中,a是main中x的别名,当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的别名。

答案 5 :(得分:0)

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