10 引用
基本使用
本质就是给变量起别名,格式 数据类型 &变量名 = 原变量名;
1如上,我们定义int &p = a;相当于p,a都是相同变量且内存地址一致,我们修改p,也等于修改a
引用注意事项
引用必须初始化,否则报错,即引用创建必须告诉是谁的别名
2第二个需要注意的是引用一旦初始化,就不可以修改指向其他变量
3即引用一旦初始化不可修改地址,但是大小是可以变换的
引用作为参数传递给函数
我们知道指针传递可以实现修改实参,比如交换方法,这里也可以用引用来实现
4这里虽然是形参,但因为是别名,所以实现了修改
引用作为函数返回类型
首先,和返回局部变量地址一样,不建议返回局部变量引用,因为这块区域虽然可能被保留,但是会被其他程序劫持
5如上,第一个还是能保留的,第二个却因为释放而不能显示10的值,注意方法执行结果使用引用接收
6所以我们一般对引用设置为静态的,让其放在全局区,就不会有栈空间的问题
7因为函数结果返回引用,所以我们此时是可以作为左值的,并且实现了对内存的修改,如上
引用的本质就是指针常量
注意不是常量指针,我们之前讲过,指针常量,指向不能改变,和引用一样,所以引用int &ref =a;本质就是int *const ref = &a;我们使用值,本质就是帮我们解引用了
8常量引用
引用本身是地址不可修改,然后常量const修饰,连值都不能修改,就变成只读了
9比如上图,我们尝试去使用引用来作为10的别名,但是会报错
10但是我们加上const修饰就不会报错,如上,这里相当于编译器给我们做了int temp = 10;const int &a = temp;当然常量引用不是仅用于此,重要的是限制形参,反之引用传参时误修改形参,导致实参改变
11如上是没有const修饰的,直接实现了修改实参
12当使用const修饰,就会告诉我们不要修改这个参数。有人又会说了本身不用引用,就不会修改实参,也许说的对,如果对象的空间大,那么形参就会开辟额外的空间,但是使用引用不会,因为还是使用已有的空间