基本使用
本质就是给变量起别名,格式 数据类型 &变量名 = 原变量名;

如上,我们定义int &p = a;相当于p,a都是相同变量且内存地址一致,我们修改p,也等于修改a
引用注意事项
引用必须初始化,否则报错,即引用创建必须告诉是谁的别名

第二个需要注意的是引用一旦初始化,就不可以修改指向其他变量

即引用一旦初始化不可修改地址,但是大小是可以变换的
引用作为参数传递给函数
我们知道指针传递可以实现修改实参,比如交换方法,这里也可以用引用来实现

这里虽然是形参,但因为是别名,所以实现了修改
引用作为函数返回类型
首先,和返回局部变量地址一样,不建议返回局部变量引用,因为这块区域虽然可能被保留,但是会被其他程序劫持

如上,第一个还是能保留的,第二个却因为释放而不能显示10的值,注意方法执行结果使用引用接收

所以我们一般对引用设置为静态的,让其放在全局区,就不会有栈空间的问题

因为函数结果返回引用,所以我们此时是可以作为左值的,并且实现了对内存的修改,如上
引用的本质就是指针常量
注意不是常量指针,我们之前讲过,指针常量,指向不能改变,和引用一样,所以引用int &ref =a;本质就是int *const ref = &a;我们使用值,本质就是帮我们解引用了

常量引用
引用本身是地址不可修改,然后常量const修饰,连值都不能修改,就变成只读了

比如上图,我们尝试去使用引用来作为10的别名,但是会报错

但是我们加上const修饰就不会报错,如上,这里相当于编译器给我们做了int temp = 10;const int &a = temp;当然常量引用不是仅用于此,重要的是限制形参,反之引用传参时误修改形参,导致实参改变

如上是没有const修饰的,直接实现了修改实参

当使用const修饰,就会告诉我们不要修改这个参数。有人又会说了本身不用引用,就不会修改实参,也许说的对,如果对象的空间大,那么形参就会开辟额外的空间,但是使用引用不会,因为还是使用已有的空间
网友评论