引用

引用是某个对象(变量)的别名
形式如下: 类型名 &引用名=变量名;
例如:

#include <iostream>
using namespace std;
int main()
{
  int i=4;
  int &r=i;
  cout<<r;
}

r和i其实是同一对内存变量,对r的操作就是对i的操作。
在使用引用是有一下几点需要注意:
1.在定义引用时&的位置是灵活的 无关于type之间有几个空格
2.在声明变量的时候的&才是引用运算符,在其他地方看做是取地址运算符

 int i;
   int &ir=i;//引用
   int &f(int &il,int &);//引用参数,函数返回引用
   int *p=&i;//qud取地址
   cout<<&i;//q取i的地址;

3.引用必须在定义是初始化,不能在定义之后在对期赋值,为引用提供初始值,同一个变量可以有多个引用,为其提供初始值时,可以是一个变量也可以是一个引用。

  int &f;//错误,未进行初始化
  int f;
  int &f1=f;//正确
  int &f2=f1;//正确

4.引用其实是一种隐式的指针,但是他与指针的用法之间存在区别。
区别一:指针必须通过才能访问他所指向的内存单元,但是引用不需要就可以访问其代表的内存单元;
区别二:指针是一个变量,可以对其重新赋值,让他指向另外的地址,但是引用必须在定义时进行初始化,而且一经定义不能再作为其他变量的引用了,下面这个例子很好的说明了这一点
这里写图片描述
在定义初始引用之后在对其赋值另一个,相当于是只把值给引用,但是引用还代表刚刚开始的那个。
5.当用&运算符获取一个引用的地址时,实际取出的是引用对应变量的地址。
6.在使用引用时要注意一下几个限制:
1.不能建立引用的引用(前面说的是用引用给引用初始化)
2.不能建立引用的数组,也不能建立数组的引用
3.可以建立指针的引用,但是不能创建引用的指针

#include <iostream>
using namespace std;
int main()
{
    int i=0;a[10];
    int &aa=a;//错误,aa是数组的引用
    int &ia[5]//错误,ia是引用的数组
    int &*p=i;//c错误,是ip是指向引用的数组
    int &&i;//cuowu错误,ii是引用的引用
    int *pi=&i;
    int *&pr=pi;//正确,pr是指针的引用
}

7.引用与左值,对于每个变量都有左值和右值,左值是指变量对应的那块内存区域的地址,是“可以放在赋值号左边的值”;右值是指变量对于内存区域中储存的数据值,是可以“放在赋值号右边的值”。
引用是一个左值,也就是说,引用一定与某块内存区域相对应,能够放在赋值号的左边。

引用和弱引用是 Java 中两种不同的引用类型,在垃圾回收机制中扮演着不同的角色。 软引用(Soft Reference)是一种相对强引用较弱,但比弱引用和虚引用强的引用类型。软引用的特点是,在系统内存充足时,被软引用关联的对象不会被垃圾回收;而当系统内存不足时,这些对象会被垃圾回收器回收,以释放内存。软引用通常用于实现内存敏感的缓存,当内存充足时可以保留缓存数据,当内存紧张时可以自动清理缓存以避免内存溢出。软引用可以通过 `java.lang.ref.SoftReference` 类来创建,例如: ```java import java.lang.ref.SoftReference; public class SoftReferenceExample { public static void main(String[] args) { Object obj = new Object(); SoftReference<Object> softRef = new SoftReference<>(obj); // 可以通过 softRef.get() 方法获取被引用的对象 Object retrievedObj = softRef.get(); } } ``` 弱引用(Weak Reference)比软引用更弱,被弱引用关联的对象只能生存到下一次垃圾回收发生之前。无论系统内存是否充足,只要垃圾回收器进行垃圾回收,被弱引用关联的对象就会被回收。弱引用常用于实现一些临时关联的对象,这些对象在不再被其他强引用引用时,能够及时被垃圾回收,避免内存泄漏。弱引用可以通过 `java.lang.ref.WeakReference` 类来创建,其实现相对简单,只重写了两个构造方法: ```java import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; public class WeakReferenceExample { public static void main(String[] args) { Object obj = new Object(); WeakReference<Object> weakRef = new WeakReference<>(obj); // 可以通过 weakRef.get() 方法获取被引用的对象 Object retrievedObj = weakRef.get(); } } ``` 此外,弱引用还可以与引用队列(`ReferenceQueue`)结合使用,当弱引用引用的对象被垃圾回收后,该弱引用对象会被加入到引用队列中,以便进行后续的处理 [^2][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值