引用是C++引进的新的特性。在这里总结一下引用的使用问题。在这里所谓的引用是指左值引用(C++11引进了一个右值引用)。
引用是为对象起别名。引用在定义的时候一般必须初始化(作为形式参数可以不用初始化)。一旦引用初始化就只能和它的初始值绑定在一起,无法解绑。因此不能给引用重新绑定一个对象。
引用是给对象起别名,那么对引用的操作其实就是对原始对象的操作。
引用的格式如下:
int a = 3;
int &A = a; //A是一个引用这时候对A的所有操作就等价于对a的所有操作。如下所示。

我们可以定义如下的常量引用。
const int& p = 12; //常量引用
const string& str = "qwert";需要注意的是 非const引用必须和对象的类型完全相同,const则不要求去类型完全一致。如下所示:
int num = 123;
const int& n = num; //ok
const int b = 456;
int& c = b; //error这里的变量c是无法绑定变量b的,但是n是可以绑定num变量的。
C++没有引用数组,有数组引用。
因为引用数组本身是个数组,无法一下子初始化。而引用要求必须初始化。C++想让使用者知道引用是不占据内存的(引用的本质是指针常量,其实占据内存)。而数组引用的本质是一个引用,只不过引用的数组而已。

指针引用只不过是引用绑定的对象是指针而已,其余的并没有什么特殊的。

可以看到引用n的属性和指针p的属性是一样的。同样可以通过*n = 300;来改变m的值。
这点需要格外注意,引用不能返回一个局部变量,只能返回一个静态变量或者是全局变量。
#include<iostream>
#include<cstdlib>
#include<string>
using namespace std;
int m = 233;
int& fun(int a)
{
int num = 3;
return num;
}
int& fun()
{
return m;
}
int& fun(string str)
{
static int n = 1;
return n;
}
int main(int argc,char *argv[])
{
int &a = fun(1);
int &b = fun();
int& c = fun("Hello");
cout << "a:" << a << endl;
cout << "b:" << b << endl;
cout << "c:" << c << endl;
return 0;
}输出如下:

可以看到a是乱码。这样能够证明引用的本质是给一块内存空间起别名。当int& fun(int a);函数运行结束的时候,局部变量num被释放,这时候返回它的引用就会引起错误。而全局变量和静态变量则没有问题。因为他妈的生存周期是整个程序运行期间。
引用常用来做函数的形参:因为这样不是值传递,从而使的对象作为参数时,不需要调用拷贝构造函数。