引用是一个目标变量的别名。对引用的一切操作和对变量的直接操作是一样的。引用的声明如下:
【数据类型】【&】【定义的引用名称】=【目标变量名】;
引用不是一种数据类型,并不占存储单元,没有数组的引用。
引用的作用:
- 可用做函数参数。引用作为参数传递给函数时,在内存中并没有产生变量实体的副本,它只是源目标变量的一个别名。
- 常引用。
const 【数据类型标识符】&【引用名】=【目标变量名】;
char x=1;
const char &rx=x;
rx=2; //错误:rx是只读的
x=2; //正确
这样的好处是可以不用担心变量的值被别名以为的改掉。
- 引用作为函数返回值。
【数据类型】&【函数名】(形参列表){函数体}
实例:
#include<iostream>
using namespace std;
int temp; //全局变量temp;
int f1(int x)
{
temp=(int)(x*x);
return temp;
}
int &f2(int x)
{
temp=(int)(x*x);
return temp;
}
int main()
{
int a=f1(5);//系统生产成返回值的副本
int b=f2(5);//系统不生成返回值的副本,可以从被调函数中返回一个全局变量的引用
int &c=f2(5);//系统不生成返回值的副本,可以从被调函数中返回一个全局变量的引用
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
getchar();
}
注意:不能返回局部变量的值。局部变量在被函数调用返回后就被销毁。那么它返回的引用所指向的内存已经没有任何意义,运行时会出现不可预知的错误。
#include<iostream>
using namespace std;
int &f1(int x)
{
int tmp;
tmp=x;
cout<<"In f1:"<<endl;
cout<<"&tmp is:"<<&tmp<<endl;
cout<<"tmp is:"<<tmp<<endl<<endl;
return tmp;
}
int main()
{
int &a=f1(5);
a=9;
cout<<"In main:"<<endl;
cout<<"&a is:"<<&a<<endl;
cout<<"a is:"<<a<<endl;
getchar();
return 0;
}
结果:
在f1结束后tmp的内存就已经释放,a是tmp的别名虽然还是指向了那段内存,但是已经没有任何意义了。
注意:
- 不能返回函数内部new分配的内存引用。因为被函数返回的引用只是作为临时变量出现的,没有被赋予一个实际的变量空间,所以这个引用所指向的空间就无法释放,造成内存泄露。
- 可以返回类成员的引用,但最好是const。