很抱歉,如果问题非常基本。
计划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之间的唯一区别是第二个程序通过引用返回。究竟有什么区别?
答案 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)
据我所知,两个节目完全相同。你没有复制正确的代码吗?通常,当您通过引用传递变量时,您将对原始变量进行更改。按值传递时,您传递的是变量的副本。这意味着,如果您通过引用传递变量并对其进行更改,则原始变量也会更改。传递价值时并非如此。