一个纠结的问题……求大神……
int ret(int &n)
{
return n;
};
和
int ret(int n)
{
return n;
};
有区别么?我都试了下,传参都直接传一个int进去没问题……那么这两种写法有什么差异?
有时候还见到函数声明前面有&符号,又是什么意思……
引用和值传递不同,引用是给变量取别名,也就是说实参和形参是同一个东西。而值传递就不同了,他是一个拷贝,会把实参的值拷贝给形参,也就是说是实参和形参是不同的变量。一般C++中值传递用的少,因为拷贝会有空间和时间上的开销,没必要。
你可以试试这段代码就知道了,把下面两个swap分别测试下
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
int tmp = a;
a=b;
b=tmp;
}
void swap(int a,int b)//引用版
{
int tmp = a;
a=b;
b=tmp;
}
int main(){
int a=1,b=0;
swap(a,b);
cout<<a<<" "<<b<<endl;
return 0;
}
int a=1;
int& b=a; //引用在定义的时候就应该对其进行初始化,在初始化的时候必须赋给其一个同类型的变量名称,
//而不是具体的值
void swap(int &a,int &b)
{
int tmp = a;
a=b;
b=tmp;
}
void swap(int a,int b)
{
int tmp = a;
a=b;
b=tmp;
}
同样可以影响到实参
下边给出地址传递的一个小函数
#include "stdafx.h"
#include<iostream>
using namespace std;
void swap(int* p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
};
void main(void)
{
int a = 1, b = 0;
int* p1, *p2;
p1 = &a;
p2 = &b;
swap(p1, p2);
cout<<a<<" "<<b<<endl;
}