我对c++引用参数有一些疑问。我正在学习这个网站:
http://www.doc.ic.ac.uk/~wjk/c++Intro/RobMillerL3.html
第一个程序:
#include<iostream>
using namespace std;
int area(int length, int width);
int main()
{
int this_length, this_width;
cout << "Enter the length: ";
cin >> this_length;
cout << "Enter the width: ";
cin >> this_width;
cout << "n";
cout << "The area of a " << this_length << "x" << this_width;
cout << " rectangle is " << area(this_length, this_width) << endl;
return 0;
}
int area(int length, int width)
{
int number;
number = length * width
return number;
}
然后作者建议"在某些情况下,要求函数修改传递给它的实际参数的值是合法的"。之后他引入了新的功能:
void get_dimensions(int& length, int& width)
{
cout << "Enter the length: ";
cin >> length;
cout << "Enter the width: ";
cin >> width;
cout << "n";
}
将值作为参数传递的主要优点是什么?
按引用传递的优点:
- 它允许我们让函数改变实参的值,这有时很有用。
- 因为没有创建实参的副本,所以即使与大型结构体或类一起使用,它也是快速的。 我们可以通过const引用来传递,以避免无意的更改。一个函数可以返回多个值。
按引用传递的缺点:
- 由于不能对文字或表达式进行非const引用,因此引用参数必须是普通变量。
- 很难判断通过引用传递的参数是输入、输出还是两者兼而有之。
- 从函数调用中不可能知道实参可能会改变。通过值传递参数和通过引用传递参数看起来是一样的。我们只能通过查看函数声明来判断参数是通过值传递还是通过引用传递。这可能导致程序员没有意识到函数会改变参数的值。
- 由于引用通常是在c++中使用指针实现的,并且对指针解引用比直接访问它要慢,因此访问引用传递的值比访问值传递的值要慢。
:
- http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/
- http://www.functionx.com/cppcli/functions/Lesson10b.htm
https://en.wikibooks.org/wiki/C + + _Programming/代码/报表/功能
已经有一个很好的答案(我不值得接受)。然而,我想给出一个更基本的答案,因为你似乎第一次遇到了通过引用传递:
这个函数:
void foo(int x){x +=1;}
可以对传递的(按值)参数的值做任何事情,但它没有机会向调用者返回任何东西,即x+=1
实际上根本没有作用。
另一方面,这个函数:
void bar(int& x){x +=1;}
不仅获取值,而且处理作为参数传递的实际变量(通过引用)。因此,x+=1
在函数之外也有影响。
两个函数的作用:
int main(){
int a = 1;
foo(a); // foo gets a copy of a and increments its value
// a is still 1
bar(a); // bar directly increments the value of a
// a is now 2
}
这是通过引用传递参数(bar)和通过值传递参数(foo)的主要区别。通过引用传递的主要优点是不需要复制形参的值。(这就是为什么按值传递通常与const引用一起完成的原因。传递const引用就像传递值一样,因为即使传递了引用,也不能更改值。)但是,要了解更多细节,请参阅rohit的回答。
int &a
是对传递给该函数的任何参数的引用,您应该始终将引用视为变量的别名(类似于const
指针)。
如果你的引用不是const
,你可以改变,从而改变原始变量的内容。
它有用的原因有很多,首先,它可以通过避免在通过引用传递参数时进行复制来提高性能,如果你有一个希望返回多个结果的函数,它也很有用,例如=:
int f (int &a,int &b,int &c,int&d);
int main
{
int first,second,third,result;
result = f(first,third,result);
}
所有的int
变量都可以在函数中更改。