二、引用形参
1、引用形参,将交换实参的值,因为引用是变量的别名。
对比:
1、值传递(复制实参)
void swap(int v1, int v2)
{
int temp =v1;
v1=v2;
v2=temp;
}
交换的是实参的局部副本,没有修改实参的值。
2、引用传递(引用是实参的别名,所以就是实参本身,就会修改实参的值)
void swap(int &v1,int &v2)
{
int temp = v1;
v1 = v2;
v2 = temp;
}
由于引用是实参的别名,使用引用作为形参适合在向函数传递大型对象时。
2、利用const引用避免复制
bool isShorter(const string &s1, const string &s2)
{
return s1.size() < s2.size();
}
对于大部分的类类型或者大型数组,复制实参的效率太低,而且某些类类型是无法复制的,使用引用形参,函数可以直接访问实参对象,无需复制。
无需修改实参时,可以使用引用,提高效率。
如果使用引用形参的唯一目的是避免复制实参,则应将形参定义为const引用。
3、更灵活的指向const 的引用
非const引用的形参不能使用字符串字面值做形参
string::size_type find_char( string &s,char c) //非const 引用,无法传入字符串字面值
{
string::size_type i=0;
while(i!=s.size()&&s[i]!=c)
{
++i;
}
return i;
}
const引用形参可以用字符串字面值做形参。将const引用实参传到形参为非const引用的函数中会产生变异错误。
非const引用形参既不能用const对象初始化,也不能用字面值或产生右值的表达式实参初始化
应该将不需要修改的引用形参定义为const引用。普通的非const引用形参在使用时不太灵活。
4、传递指向指针的引用
实现两个指针的交换
void ptrswap( int *&v1,int *&v2)
{
int *tmp = v2;
v2 = v1;
v1 = tmp ;
}
形参 int *&v1的定义应从右至左理解,v1是一个引用,与指向int型对象的指针相关联。
三、vector和其他容器类型的形参
通常,函数不应该调用有vector或其他标准库容器类型的形参。调用含有普通的非引用vector形参的函数将会复制vector的每一个元素。
事实上,C++程序员倾向于通过传递指向容器中需要处理的元素的迭代器来传递容器:
void print( vector <int>::const_iterator beg,
vector <int>::const_iterator end)
{
while (beg != end ){
cout<< *beg++;
if(beg != end ) cout <<" ";
}
cout<<endl;
}
该函数将输出从beg指向的元素开始到end指向的元素(不含)为止的范围内所有的元素。