【概念】
一个引用就是某对象的另一个名字。引用主要用途就是为了描述函数的参数和返回值,特别是为了运算符的重载。记法X&表示到X的引用。(我感觉,这里可以理解为linux操作系统中的文件的硬链接~。但是不知道是否很确切。。。。)
void f()
{
int i =1;
int &r = i;//r和i现在引用同一个int
int x =r;//x=1
r=2;//i=2;
}
【必须对引用初始化】
为了确保一个引用总能是某个东西的名字(也就是说,总能约束到某个对象),我们必须对引用做初始化。例如,
int i = 1;
int &r1 = i;//正确:r1被初始化。
int &r2;//错误:没有被初始化。
extern int& r3;//正确:r3在别处初始化。
【(引用不开辟内存空间)改变引用的值就相当于改变了引用引用变量的值】
引用的一种最明显的显示方式是作为一个(常量)指针,在每次使用它时都自动地做间接访问。将引用想象成这种样子不会有任何问题,但是,一个引用并不是一个对象,不能像指针那样去操作:
void g()
{
int ii=0;
int &rr= ii;
rr++;//ii被增加1
int *pp = &rr;//pp指向ii
}
【不能直接引用常量,加const修饰就可以】
double& dr =1;//错误:要求左值。
const double & cdr = 1;//ok;
后者解释:
double temp = double(1);//首先建立一个具有正确值的临时变量。
const double &cdr = temp;//而后用这个临时变量作为cdr的初始式。
【参数传递引用更具有安全性】
普通交换俩个值
void Swap(int *a,int *b)
{
if(nullptr == a || nullptr == b) return;
int tmp = *a;
*b = *a;
*a =tmp;
}
使用引用作为参数
void Swap(int &a,int &b)
{
int tmp = a;
b = a;
a =tmp;
}
对比:引用作为函数的参数,1,增加了程序的可读性。2,少了"判空"操作,程序更安全。