> 文章列表 > 【c++初阶】:引用

【c++初阶】:引用

【c++初阶】:引用

c++入门

  • 一.概念
  • 二.使用
  • 三.应用
  • 四.常引用
  • 五.引用与指针

一.概念

【c++初阶】:引用

c语言中我们常用指针找地址,但在c++中,忽略了指针(当然也可以使用指针)。常用引用这个概念。

二.使用

【c++初阶】:引用

【c++初阶】:引用

【c++初阶】:引用

可以看到这里的b和c本质上都是a,只是不同的称呼罢了。

一个问题,下面这段代码是将x赋值给了b,还是b变成了x的别名呢?

【c++初阶】:引用

【c++初阶】:引用

答案是x赋值给了b,这也是c++与java在引用上最大的区别。c++的引用是不可更改的。

总结:1. 引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体

三.应用

作参数

那么引用在实际工程里有什么作用呢?我们可以看一个经典的函数。

【c++初阶】:引用

【c++初阶】:引用

在c语言中我们必须传地址才能实现交换,在c++中直接引用毫无疑问方便多了。

引用作返回值

【c++初阶】:引用

在函数建立栈帧并开始返回时会创建一个临时变量来存储返回值,之后再将其带回(如果数据较小,通常是寄存器,如果对函数栈帧不了解可以看看这篇博客函数栈帧),而我们可以直接通过返回引用,这样的话编译器就不会产生临时变量从而极大的提高我们的效率。

注意,引用跟指针类似,这里是因为n加了static储存在静态区,才不会随着函数栈帧的销毁而被销毁,才能直接通过引用(地址)来返回n。

【c++初阶】:引用

【c++初阶】:引用

【c++初阶】:引用

【c++初阶】:引用

四.常引用

在引用过程中,权限不能被放大但可以平移或者缩写,例如:原来的量不能被改变,那么你的引用也不能被改变。

【c++初阶】:引用

【c++初阶】:引用

这也是一个权限被放大的问题,返回的整形是一个临时变量,而临时变量具有常引性(常数性)不能被修改,所以ret在这权限被放大了。要如下写:

【c++初阶】:引用

此时的ret也不可被修改,实现了权限的平移。同理下面也是一样的道理。

【c++初阶】:引用

从double转换到int会进行隐式类型转换,会创建一个临时变量,而临时变量具有常引性不可被修改,所以这里的yy也是权限被放大了,可以如下改:

【c++初阶】:引用

五.引用与指针

联系

引用在语法层面上只是一个量的别名,不开空间但实际上在底层汇编语法上看引用是类似与指针的方式实现的。

【c++初阶】:引用

【c++初阶】:引用

区别

【c++初阶】:引用