引用是某一变量(对象)的别名,对引用的操作和对变量的操作完全一样(操作引用就相当于是在直接操作变量)。
引用需要注意的地方:
1 声明引用时,必须同时对其进行初始化。
2 引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
3 不能建立数组的引用。
使用引用的常用地方:
1. 引用作为函数的参数。
<1> 被调函数中对引用形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。
<2> 当参数传递的数据较大时,用引用比用一般变量传递参数的效 率和所占空间都好。(不产生副本)
<3> 相对于指针传值,引用传值更清晰,更便于阅读。
2. 如果要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用
const 类型标识符 &引用名=目标变量名;
3. 引用作为返回值
格式:类型标识符 &函数名(形参列表及类型说明)
{函数体}
以引用返回函数值,定义函数时需要在函数名前加&, 用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。
注意:
<1> 不能返回局部变量的引用。
<2> 不能返回函数内部new分配的内存的引用.
4 引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。(这个不是很熟悉)
#include <iostream>
using namespace std;
void change(int &a,int num)
{
cout<<&a<<endl;
a= num;
}
int& change2(int &b,int num)
{
b += num;
return b;
}
int main()
{
int a = 1;
int &b = a;
cout<< b << endl; // 1
a = 2;
cout<< b << endl; // 2
cout<<&a<<endl;
cout<<&b<<endl;/* &b is same with &a*/
change(b,100); /*reference as function parameter*/
cout<< b << endl; // 100
const int &c = a;
//c = 300; /*error: can't change const &*/
/* reference is same with const pointer*/
int a1= 10;
int &b1 = a1;
b1++;
cout << a1 << " " << b1 <<endl;
cout << &a1 << " " << &b1 << endl;
int a2=20;
int *const b2 = &a2;
(*b2)++;
cout << a2 << " " << *b2 << endl;
int a3 = 111;
int a4 = 222;
int &b3 = a3;
b3 = a4;
cout << b3 <<" "<< a3 <<" "<< a4 <<endl; //222 222 222
cout << &b3 <<" "<< &a3 <<" "<< &a4 <<endl; /* b3 is still the alias of a3, nothing to do with a4*/
/*reference as return value of function*/
int a5 = 400;
int &b5 = a5;
a5 = change2(a5,100);
cout<< a5 << " " << b5 << " " << endl;
change2(a5,200) = 30;/*return value can as left value*/
cout<< a5 << endl;
return 0;
}
附:引用与指针应用区别
(1)非空区别。在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让他指向一个对象,但是该变量在某些时候也可能不指向任何对象,这是你应该把变量声明为指针,因为这样你可以赋予空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。不存在指向空值得引用这个事实意味着使用引用的代码效率比使用指针要高。
(2)合法性区别。在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。
(3)可修改区别。指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则是总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。
(4)应用区别。总的来说,在以下情况下你应该使用指针:一是你考虑到存在不指向任何对象对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。