有关c++的引用

c++中的引用

很多人其实都对c++中的引用感觉和指针有些混淆,完全不知道这是什么,下面我就为大家介绍一下引用:
引用呢,首先你别将他想的太复杂。
我们从定义一个变量的角度来看看看这个问题。
一个变量,它的本质便是内存单元,内存单元可以存储数据,也可以将存储的数据读出。我们可以抽象的将他当做由两部分组成:
1.内存的地址
2.他所储存的数据

由此我们便来分析分析引用。
引用呢,是一个变量的别名。
别名意味着什么,看代码来分析:
int a=10;
int &b=a;
我们定义了一个变量a,他的内存大小为4字节,其中中存储数据为10;
而接着便定义了一个引用 b,这个b也就是变量a别名了。
又人又会问,那变量名a,存了哪里。
其实变量名a并不会占用内存,编译器在将代码生成目标文件时,会将a这个变量名用a的地址来替换,所以变量的名字并不会占内存。
至于定义的这个引用b。
大家肯定会在我解释变量名a不占内存的时候出现这种想法:b是变量a的别名,所以定义的引用b便不会去申请内存了,他直接会在在编译的时候用a的地址所替代。
但事实却不是这样的。
这个我查找了很多的信息,不过结果很抽象,所以我的见解仅供参考。
根据一些比较权威的信息来看。
因为在底层的引用其实和指针所做的事是一样的,所以大家完全可以将引用看做一种特殊的指针,常指针。
引入一下常指针的概念
常指针又是什么呢?常指针就是指针内存内所储存的地址是不能被修改的,也就是没有办法去修改指针所指向的内存地址,但可以通过它修改他所指向地址内存存储的数据。

作为指针,定义自然是得申请空间的,而作为在底层汇编时和指针做着同样事情的引用b自然也不例外,但他申请空间是做什么呢?
这里,当定义一个引用b的时候,会申请一个整型4字节的空间,干什么?他是用来存储变量a的地址的。
这下大家应该就能明白了,原来,定义一个引用和定义一个指针是一样的,也是要申请空间的,而定义出来的空间也会和指针一样用来存储所引用(指向)变量的地址。

那么既然申请了空间,那引用变量自然便会出现下面这些性质了:

(1)引用必须初始化,且初始化不能为null,而且一经引用便不能被改变

这很容易理解,因为引用如果申请了一块内存那就不能让它空置着,否则会出现内存泄露的。
而且引用的性质和常指针一样,那么便意味着他所储存的地址是不能更改的,那么如果不初始化便没有了意义,他会相当于一个野指针。而若是初始化为NULL,那也没有什么意义。当然你如果这么做系统是会报错的。

(2)引用比指针安全

引用既然可以看做一个常指针,那么他内存里面的东西自然是不能被修改的,这很容易理解。
而我们使用引用的目的呢,便是因为在使用指针的时候会出现空指针和野指针的情况,而使用引用能很好的便能避免这一点,因为他不会出现空引用了,自然他会比指针安全了。
这也就是杀鸡我们不用宰牛刀,用就用最合适的,宰牛刀去杀鸡可是会一不小心伤到自己的。

(3)没有办法通过指针去访问引用所开辟的内存

道理很简单,*和&是相互对立的,你用指针去访问引用,便会解引用,所以引用所开辟的内存是没法被访问的。

(4)引用没有多级引用

个人见解,这是因为多级访问引用是没有意义的,而且如果能够通过多级引用得到这个一级引用所存储的地址就可以通过这个地址去查看一级引用内存内存储的所引用的地址数据了,而这是我们不想看到的,毕竟我们引入引用就是为了修补指针的这些问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值