引用形参
*是去引用运算符,或称之为间接引用运算符
首先看一下 普通形参
int add1(int a) { return a+1; } void main() { int num = 10; int num2; num2 = add1(num); }
在这种情况下,num的值不会因为调用了add1而改变,即实参的值不变。
再来看一下 指针参数
void add2(int *p) { *p +=1; } void main() { int num1; add2(&num1); }
使用指针做为函数的形参,指针的值(即&num1)不会因为*p+=1而受到影响,但是&num1这个地址里存放的值(num)增加了1。所以要想修改实参的值,可以使用指针形参的方法。
但是还有一种更安全更自然的方法-引用形参
引用形参的格式如下面函数所示:
void swap(int &a,int &b) { int temp=a; a=b; b=temp; }
如果在主函数中调用swap()函数:
void main() { int x = 10, y = 20; swap(x,y); }
那么实参x和y的值会被调换过来,也就是说如上所写的引用形参会修改实参的值。
如果不想修改实参的值,应该加上const,如下面例子所示。
void swap(const int &a,const int &b)
引用形参直接关联到其所绑定的对象,而非这些对象的副本。 所以这种方法可以修改实参的值,而且更加直观。
注:以下内容转自http://www.cppblog.com/liujiajia/archive/2008/07/14/56131.html
使用引用形参的优点:
在向函数传递大对象时,需要使用引用形参。虽然赋值实参对于内置数据类型的对象或者规模较小的类型来说没有什么问题,但是对于大部分的类型或者大型数组,它的效率就比较低了。另外,某些类型是无法复制的。使用引用形参,函数可以直接访问实参对象,而无须复制它。
示例:
bool isShorter(const string &str1,const string &str2)//const
{
return str1.size()<str2.size();
}
由于string对象可能非常的长,我们希望避免复制操作。
如果使用引用形参的唯一目的是避免复制形参,则应将形参定义为const引用。
使用引用形参应该注意的:
int incr(int &val)
{
return ++val;
}
void main(void)
{
short v1=1;
const int v2=10;
int v3=20;
incr(v1); //错误,v1不是int
incr(v2); //错误,v2是const
incr(v3); //正确
incr(10); //错误
}
所以,调用非const类型的引用形参,实参必须不是const类型的,而且实参的类型和形参的类型应当一致。
一个引用形参被翻译成一个指针变量,相应的实参被翻译成这个实参的地址。当在函数中被使用时,指针形参被自动的去引用,从而产生对应实参的别名。(from数据结构与算法分析)
在以上例子中,引用形参 val被翻译成一个指针变量,调用incr(v3)时,v3这个实参被翻译成v3的地址。
关于指针和指针的引用可以看: http://www.cnblogs.com/no7dw/archive/2011/03/19/1988540.html