一、引用基本概念及语法
引用熟称别名,二者完全等价
例子:int a = 10; int &b = a; a = 20; cout<<“a="<<a<<" b="<<b<<endl;
解释:b为a的引用,b与a共享一块存储单元(牢记这一点),因此对a操作等效于对b操作,上述执行后,b的值也变为20
二、引用的一些特性
1)声明引用必须同时初始化(皮之不存毛将焉附)
2)一个变量可以有多个引用(张三,你可以叫他小张,小三,猫蛋,狗蛋;实际上,代码中极少有给变量声明引用的情况,毫无意义)
3)特别重申:引用与原对象占同一块存储单元(这使得使用引用不会做内存拷贝,效率高,同时使用也得注意)
三、引用的使用场景
使用引用,主要是为了代码提高效率,因为二者占同一块内存,不用拷贝
1)引用作为函数参数传入
声明:void function1 (int &a) // 作用:提高效率,且函数内改变形参 a 的值对实参有效
使用:int a = 10; function1 (a); //注意传入没有 & 运算符
常引用声明:void function2 (const int &a); //作用:提高效率,且保证函数不会修改实参的值,提高代码的安全性
2)引用作为函数返回值
声明:int & function(...) //作用:提高效率,返回的对象不用拷贝(不使用引用,会拷贝副本,将副本返回)
使用:int a; a = function(...);
使用场景:重载操作符 +=, -=, *=, /= 等,因为这些运算返回后赋值给自身,自身”赋值“给自身,使用引用天造地设
class A{...};
A& operotor ++() ; //前置++,这也是推荐使用前置++的原因
A& operator --(); //前置--
A& operator +=(const A&);
A& operator -=(const A&);
A& operator *=(const A&);
A& operator /=(const A&);
注意事项:禁止将函数中的临时变量作为引用返回(临时变量在函数返回后即被释放,由于二者占用同一块内存,故返回的值将随之失效)
例如:int &function() {int a=10; return a;}; // a 会在函数返回后被释放
3)引用与多态,类似于指针
class Parent{...};
class Child: public Parent{...};
Child c;
Parent &p = c;
Parent *p2 = &c; //个人感觉指针更灵活,可以改变指向的对象,方便类型转换, 例如 p2 = (Child *)p2; 这时 p2 就可以访问子类的所有成员
总之,记住引用和被引用的对象占用同一块内存,不用拷贝,效率高,二者同生共死,使用的时候注意了,记住这点就知道什么场合该使用引用
参考文章:运算符重载