引用
起别名,不开辟新的内存空间,和引用对象使用同一内存空间
数据类型&名字=原数据;
例:int & b=a; 此时为将a的地址传给b
注意:
1.引用类型必须和原类型是同一种类型
2.一个变量可以有多种引用,即多个别名
3.引用时必须初始化
4.引用一旦确定不能再改变对象
5.引用和指针的底层实现一模一样
引用作为返回值时应注意的点(以下面两个函数为例):
int at(){return m_data;}
int &at(){return m_data;}
从反汇编代码中看出,此两者的区别在于 返回引用类型的函数在return m_data后,会直接将c的地址放在寄存器中,然后回到主函数后从寄存器中直接取出地址。
返回非引用类型的函数, 在return m_data 后会先将地址放在寄存器中,再取地址中的值放在寄存器中,并且为了给主函数传递这个值会开辟一个临时的内存空间来存放这个值,再将这个值操作传递给所需变量,而引用返回则不会开辟此空间。
因此传值调用的效率远远不及传引用(传址) ,当次数足够大时,时间空间损耗差异非常大
注意:不能将一个返回非引用类型的函数放在右边给引用值初始化即:
int test(int a){return a;}
int &b=test(10); //不可以这样 因为这样相当于拿一个常量来给引用初始化
如是 int &test(int a){return a;}
int &b=test(10); //可以这样
引用和指针的不同点:
**1、指针有自己的一块空间,而引用只是一个别名
2、引用在定义时必须初始化,而指针非强制
3、引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
4、 没有NULL引用,但有NULL指针
5、没有const引用,可以有const指针;
6、在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4 个字节)
7、引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
8、有多级指针,但是没有多级引用
9、 作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改都会改变引用所指向的对象
10、 引用比指针使用起来相对更安全
11、如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。
**