C++ — 引用浅谈

引言        

        在C++的语法规则中,定义了一种新的方法,叫做引用。在学习的初期,引用的作用很类似于指针(但需要注意引用不等于指针),引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名。

        在上边的程序中,b为a的引用,能够看出,b和a的地址是相同的,这就代表编译器没有开辟出额外空间分配给b,引用的规则就是 类型& 引用别名 = 引用对象。(需要注意,虽然这里的引用用了和取地址一样的符号&,但代表的含义是完全不一样的)。

        和指针相似,如果我们改变b的值,a的值也会跟着改变。因为b相当于a的别名

引用的特性

        引用在定义时必须进行初始化,类似于int& b;这种语句在编译器中会报错;一个变量可以有多个引用,例如在上面的程序中还可以写出int& c = a;,这时改变c,会同步改变a和b;同时,引用一旦指定一个实体,就不可以再继续指向其他实体,也就是说,引用绝对“忠诚”。

        从上图可以看出,在执行完b = d后,虽然a,b,c的值同步变为了30,但是a,b,c的地址却并没有变成d的地址,也就是说这个语句仅仅只是执行了赋值操作,没有真正地让b成为d的引用。

引用的使用

        引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被引⽤对象。

        将引用作为参数,能够实现和指针类似的效果,就比如swap(交换)函数,利用引用就能够实现交换。而在一般的传值调用函数中,形参是实参的临时拷贝,这时传引用,由于引用是变量的别名,使用同一块内存空间,就不需要进行拷贝操作,从而节省损耗,提高效率。

        利用引用作为返回值,需要注意的地方在于,不能使用局部变量做引用返回!

        在这段程序中,我们返回count的别名,但是当fun函数执行完毕后,该函数的栈帧销毁,而此时,ret的结果仍然是未定义的,系统清理完栈帧后置为随机值,此时ret也就是随机值。

        那我们该如何改变程序呢?其实在count变量前加上static关键字,在堆上创建空间,即使fun函数执行完后也不会被销毁,这才是返回引用的正确做法。

常引用

        在之前,我们接触过用const修饰变量,此时变量的值是不能修改的。我们也可以用引用const对象,但是权限不能发大

       

        同时需要注意的是在C++中,临时变量具有常属性(所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象,C++中把这个未命名对象叫做临时对象)。就比如int a = b(double 类型) / int a = (b+c),在类型转换和没有具体值的表达式中会产生临时对象,而临时对象具有常属性,这时想要创建他们的引用就必须用常引用。

指针与引用

        指针与引用很想兄弟一样的存在,他们的作用具有重叠性,但是他们之间存在着许多的不同:

        1、语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
         2、 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
        3、引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
        4、引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
        5、sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
        6、指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。

        

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值