引言
在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),在类型转换和没有具体值的表达式中会产生临时对象,而临时对象具有常属性,这时想要创建他们的引用就必须用常引用。
指针与引用
指针与引用很想兄弟一样的存在,他们的作用具有重叠性,但是他们之间存在着许多的不同: