引用是某个对象(即变量)的别名.即某个对象的替代名称(相同于一个人的小名).
引用是一个左值,在C++中,引用主要用来定义函数的参数和函数返回类型.
因为引用只需要传递一个对象的地址,在传递大型对象的函数参数或从函数返回大型对象时,可以提高效率.
使用引用时的注意事项:
①在定义引用时,引用符&与指针运算符一样,在类型和引用名之间的位置是灵活的,下面 3 种定义是完全相同的。
int& ir = i; //& 靠近类型 int & ir = i; //& 2不靠近 int &ir = i; //& 靠近变量
②在变量声明时出现的&才是引用运算符(包括函数参数声明和函数返回类型的声明),其他地方出现的&都是地址操作符。
int i; int &ir = i; //引用 int& func(int &i1, int &); //引用参数,函数返回引用
③引用必须在定义时初始化,不能在定义完成后再给它赋值,为引用提供的初始值,可以是一个变量,也可以是另一个引用名,同一个变量可以定义多个引用。
float f; float &fr = f; float &r1 = f; float &r2 = f; float &r3 = r1;
④引用实际是一种隐式指针,但是与指针的用法有很大的区别
? 指针必须通过解引用运算符"*"才能访问它所指向的内存单元.而引用不需要,用法与普通变量一样.
? 指针是一个变量,可以重新赋值.但是引用必须在定义时进行初始化,以后不能成为其他变量的引用.
? 有空指针,无空引用。
? 由于指针也是变量,所以可以有指针变量的引用。
⑤建立引用时,有以下3个限制
? 引用本身不是一种数据类型,所以没有引用的引用,也没有引用的指针
? 不能建立引用数组
?
不能建立数组的引用
? 两者在作为形参的时候非常相似,区别是指针拷贝副本,引用不拷贝。
//两者在作为形参的时候非常相似,区别是指针拷贝副本,引用不拷贝 #include<iostream> using namespace std; void pt(int *pta,int *ptb) { int *ptc; ptc=pta; pta=ptb; ptb=ptc; } void ref(int &ra,int &rb) { int rc; rc=ra; ra=rb; rb=rc; } int main() { int a=3; int b=4; int *pa=&a; int *pb=&b; pt(pa,pb); cout<<"zhizhen: a="<<a<<",b="<<b<<endl; a = 3; b = 4; ref(a,b); cout<<"yinyong: a="<<a<<",b="<<b<<endl; return 0; } /* 输出结果: zhizhen: a=3, b=4 yinyong: a=4, b=3 */
⑥当使用&运算符取一个引用的地址时,实际上取到的是引用的变量的地址.
int i = 9; int &ir = i; int *p1 = &ir; int *p2 = &i; //结果是 pi = p2
⑦从内存上来讲 系统为指针分寸内存空间,而引用与绑定的对象共享内存空间,系统不为引用变量分配内容空间。
⑧引用访问对象是直接访问,指针访问对象是间接访问。
间接访问的含义是先从其它内存空间获得要访问的内存地址,根据得到的地址访问目的地址。
⑨如果返回动态分配的对象或内存,必须使用指针,引用可能引起内存泄漏。
---------------------------------------------------------------------------------------------------
参考资料:
<<C++面向对象程序设计(第二版)>>
http://zhidao.baidu.com/question/321717839.html
http://blog.renren.com/share/275441937/12967099702
http://upc.gg.blog.163.com/blog/static/2979849820108281181754/