C++的引用

文章详细介绍了C++中的引用概念,它作为已存在变量的别名,不占用额外内存。引用在函数参数传递和返回值中提供了优化,避免了数据拷贝。同时,文章对比了引用与指针的差异,尽管在底层引用可能表现为指针,但在语法层面它们有显著区别。文章强调了使用引用时需注意的内存生命周期问题,尤其是引用静态变量的必要性。
摘要由CSDN通过智能技术生成

目录

引用概念

引用的用法

做函数形参

优点一

优点二

引用做返回值

让我们更深入的了解引用与指针

语法层引用与指针完全不同的概念

站在底层的角度看指针与引用


笔记类型文章

引用概念

在语言层面上:引用不是定义新的变量,而是给已存在变量再取一个别名,编译器不会为引用新开一个空间,他和他的引用的变量共用一块内存空间,

如李逵在家叫“铁牛”在外叫“黑旋风”

看代码,为a取别名

int main()
{
    int a = 10;
    int&b = a;//为a取别名b
    return 0;
}

内存查看

打开内存发现他们都是一个地址。

会发现a,b地址相同

他们的地址都是相同的,所以我们可以认为引用并没有开空间,也只是在一块空间上多了个别名,依靠这个别名也可以访问该空间数据。

监控查看

我们更改别名的数据,同时也会把被取别名的数据更改

所以可以通过修改b的数据,从而修改a的数据。这里是十分重要的。

引用的用法

做函数形参

优点一

 这里的func1传值做参数,需要拷贝a的数据。

然而func2为引用做参数,无需拷贝数据,这_a为a的引用,用同一块空间

优点二

 引用可以通过改变形参来改变实参。(类似指针的用法)

引用做返回值

正常的函数返回值接收

int func()
{//....
    return 10;
 //....
}
    
//......
    int ret=func();
//..

有两个情况:

一、函数返回值为引用,接收变量不为引用,减少一次数据的拷贝。

 这里有个隐患,当func函数结束会销毁栈帧,OS回收数据,但是是否会重置数据就看编译器了。所以我们引用返回值尽量都是引用静态变量为返回值。

int&func()
{
    static int a=10;
    return a;
}

二、函数返回值为引用,接收变量也为引用,直接没有数据拷贝(两次都没有了)。

        这里引用的对象必须是static的变量,否者在未来,一旦有一次任意函数调用都有可能覆盖值。

        看我们的流程,既然ret是a的引用,哪为什么还要有临时空间呢?因为在函数结束后只要是return 数据,都一定要放入临时空间保存,无论是否是引用,因为一旦栈帧销毁了,我们就不能再去访问函数内的操作,所以这个时候就要靠临时空间将我们需要的数据带出来,可能是寄存器也可能是上一层栈帧的头部位置开空间做临时空间。在语言层面来看:临时空间不会开空间,并不是说可以取消临时空间


让我们更深入的了解引用与指针

语法层引用与指针完全不同的概念

指针:开空间,存放变量地址;

引用:不开空间,仅仅是变量的别名

//.Cpp
int main()
{
    int a=1;
    int& b=a;
    int*p=&a;
    b=2;
    *p=3;
    return 0;
}

上面的知识点可以看看,但是不要靠背他们

其实我更喜欢指针,可以看到细节,都在自己的掌控之中

站在底层的角度看指针与引用

先让我们学两个指令:

mov  a  b   将b数据放入给a中

lea    eax  a  将a的地址放入寄存器eax中

观察汇编代码,我们惊奇的发现:pa指向a与ra引用a的操作居然是一模一样的。

这里说明了,引用其实就是指针,但是他的操作逻辑操作不是我们程序员的事情,是编译器的事情。


所以虽然我们只要关注语言层面的引用,但是底层的引用我们也不能不知道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云的小站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值