引用就像是一个人的小名一样,它可以有多个但终究代表的是一个人。在C++中,变量的引用就是变量的别名。
一.在使用引用的过程中,我们需要注意以下几点:
1.在声明引用时必须立即对它进行初始化;
int i=10;
int &j;
j=i; //错误,不能声明完成后再赋值
2.变量类型要相同;
double a;
int &b=a; //错误,变量类型不符
const int &b=a; //编译可通过,但是从double转换到const int可能会丢失数据
3.为引用提供的初始值,可以是一个变量或另一个引用;
int i=0;
int &j1=i;
int &j2=j1;
这样,j1和j2均为变量i的别名
4.引用在初始化后不能被再被重新声明为另一变量的引用;
5.一个变量和它的引用的值是同步更新的,并且共享同一内存单元,所以系统并不为引用另外分配内存空间;
6.指针是通过地址间接访问某个变量,而引用是通过别名直接访问某个变量;
7.不能建立引用的数组;
int a[3]={0,1,2};
int &refa[3]=a; //错误
8.不能建立引用的引用,不能建立指向引用的指针;
int m=1;
int &&refm=m; //错误
int &*p=m; //错误
9.可以将引用的地址赋给一个指针,此时指针指向的是原来的变量;
int a=10;
int &b=a; //b是a的引用
int *p=&b; //指针变量p指向a的引用b,相当于指向a
二.引用作为函数参数
1.之前,交换两个数时我们知道传参要传地址.
void Swap(int *left,int *right)
{
int tmp=0;
tmp=*left;
*left=*right;
*right=tmp;
}
在学习C++后,我们还可以通过一种更高效的方式来实现即引用作为函数参数。
void Swap(int &left,int &right)
{
int tmp=left;
left=right;
right=tmp;
}
那么有疑问就来了,既然这两种都能达到我们想要的效果,那么它们有什么区别呢?
@首先,传址时要为指针变量开辟内存空间,而引用它是实参的别名与其占用同一块内存,不需用单独为其开辟;
@其次呢,传引用效率比传指针效率更高;
@最后呢,传引用更加的直观,方便。
2.当不希望函数内改变参数的值时,尽量使用常引用传参(即引用参数被const修饰)。
引用和指针的区别和联系
1. 引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。
2. 引用必须指向有效的变量,指针可以为空。
3. sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。
4. 指针和引用自增(++)自减(--)意义不一样。指针的++是指向下一块空间,而引用的++是在原有值的基础上加1
5. 相对而言,引用比指针更安全。
总之,指针比引用更灵活,但是也更危险。使用指针时一定要注意检查指针是否为空。指针所指的地址释放以后最好置0,否则可能存在野指针的问题。
三.使用引用返回函数值
前者使用传引用返回时是取tmp的地址到eax寄存器中;后者使用传值返回时是将tmp的值放到eax寄存器中。
结论:
1. 不要返回一个临时变量的引用。
2. 如果返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效。