引用变量:
1、引用变量是已经定义的变量的别名,通过引用变量作为参数,函数将使用原始数据,而不是其副本。声明引用必须将其初始化。
例如:
Int rate;
int & rodents = rate;等价于 int * const rodents = &rate;
int &表示:指向int 的引用,&不是地址运算符,将rodents声明为int类型的引用。
2、将引用用作函数的参数(引用传递):
引用传递的好处,以交换函数为例:
按值传递变量将不管用,因为交换的是原始变量的副本,而不是变量本身的内容。
/******************交换函数-引用传递demo*****************/
//引用传递
void swapr( int & a,int & b)
{
int temp;
temp=a;
a=b;
b=temp
}
//指针传递
void swapp(int *p,int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
//按值传递,不管用
void swapw(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp
}
3、引用的属性和特别之处
Double cube (const double &a)//我们不希望函数修改引用
{
....................
}
在这个函数中,引用变量的值不允许修改,一旦被修改,就会报错。
调用引用传递的参数的函数时,实参应该严格一致。实参和形参不一致的时候,会产生临时变量。
应尽可能使用const,理由是:使用const 可以避免无意中修改数据的编程错误;使用const使函数能够处理const和非const 实参,否则只能接受非const实参;使用const引用使函数能够正确生成和使用临时变量。
4、返回引用时需要注意的问题
(1)当函数返回引用类型时,没有复制返回值。相反,返回的是对象本身。
const string &shorterString(const string &s1,const string &s2)
{
return s1.size < s2.size ? s1:s2;
}
形参和返回类型都是指向const string对象的引用,调用函数和返回结果时,都没有复制这些string对象
(2)返回引用,要求在函数的参数中,包含有以引用方式或指针方式存在的,需要被返回的参数。
int& abc(int a, int b, int c, int& result){
result = a + b + c;
return result;
}
这种形式也可改写为:
int& abc(int a, int b, int c, int *result){
*result = a + b + c;
return *result;
}
但是,如下的形式是不可以的:
int& abc(int a, int b, int c){
return a + b + c;
}
(3)千万不要返回局部对象的引用。当函数执行完毕时,将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。如:
const string &manip(const string &s)
{
string ret =s;
return ret; //wrong:returning reference to a local object
}
(4)由于返回值直接指向了一个生命期尚未结束的变量,因此,对于函数返回值(或者称为函数结果)本身的任何操作,都在实际上,是对那个变量的操作,这就是引入const类型的返回的意义。当使用了const关键字后,即意味着函数的返回值不能立即得到修改!如下代码,将无法编译通过,这就是因为返回值立即进行了++操作(相当于对变量z进行了++操作),而这对于该函数而言,是不允许的。如果去掉const,再行编译,则可以获得通过,并且打印形成z = 7的结果。
include <iostream>
include <cstdlib>
const int& abc(int a, int b, int c, int& result){
result = a + b + c;
return result;
}
int main() {
int a = 1; int b = 2; int c=3;
int z;
abc(a, b, c, z)++; //wrong: returning a const reference
cout << "z= " << z << endl;
SYSTEM("PAUSE");
return 0;
}