啃书《C++ Primer Plus》之 C++ 引用

笔者正在学习C++语言,啃书系列将会持续更新,希望可以同大家一起学习,一起进步。如果文章有帮助的话,记得点赞、收藏、关注一条龙哦。

系列文章:
啃书《C++ Primer Plus》之 C++ 函数指针
啃书《C++ Primer Plus》之 C++ 名称空间1
啃书《C++ Primer Plus》之 C++ 名称空间2


这一节,我们来梳理C++中相对于C新增的机制——引用。下面是本节的导图
在这里插入图片描述


引用概述

在了解引用的各种使用规范和技巧之前,我们先来对引用进行一些基本的了解。作为C++语言新引进的机制,它的存在更多是为了优化在C语言编程过程中的一些过程,同时也和C++新增的特性——面向对象有关。
所以,了解引用这个概念,我们主要从它是什么和它用来解决什么问题两方面进行。

引用是什么

要回答引用是什么这个问题其实很简单。引用,其实就是给已定义的变量别名。通俗些说,就是给一个已经存在的变量起一个外号。在这之后,外号就是这个变量的另一个名称。

引用用来解决什么问题

有时我们也将起外号这个过程放在函数的参数值传递中,这样一来,“起外号”这个行为就有了新的意义:它让一个变量以一个新的名称以参数的形式出现在了另一个函数中,这同以往的传递值很不相同。
更多时候,我们使用引用来传递整个对象或是结构,这种起外号的方式省去了重新创建并拷贝的过程打打节约了时间和空间。在这个意义上,它的作用倒是和指针有些类似,虽然引用底层是通过指针实现的,但是他们终究是存在区别的。关于概述,就先说到这里,只通过比喻来认识引用是不够的,我们需要在下面对其进行更加深入的了解。


引用的创建和赋值

有关引用的创建于赋值,这一块的内容相对简单。我们先说引用的创建形式:

类型名 &应用变量名称 = 被引用变量;

在这个行驶中,需要注意到,引用的创建类似于变量的创建(毕竟只是起一个外号)。不同于创建变量,创建引用的时候需要在类型名后面加上一个 & 符号表示这是一个引用变量,这个机制倒是同指针的创建有些许相似。
在此需要注意的是:
创建引用使用的 & 符号不是取地址符号!!
创建引用使用的 & 符号不是取地址符号!!
创建引用使用的 & 符号不是取地址符号!!

(这个道理同创建指针使用 * 不是取值符号相同,它们在不同的地方表示不同的含义。但是这并不影响我将重要的事情重复三遍!)

说完创建形式,还有一个点需要注意,也许你也注意到了,在说明创建形式的时候,有意的给创建的引用变量赋予了初值。这是非常必要的。因此,我有必要将它也强调三遍:
引用变量创建时必须进行初始化!!
引用变量创建时必须进行初始化!!
引用变量创建时必须进行初始化!!

嗯,舒服了~~

那么,我们接着说,引用这种必须进行初始化的设计,是否尤其用意呢?或者说,我们可不可以在初始化过后再使他引用另一个变量呢?
对于后者,答案是不可以!其实这个问题很好回答,只需要稍加思考,就会得到答案。
从初始化的形式来看,让引用变量指向一个变量的方式是:

引用变量 = 普通变量

那如果仍保持这种等号的赋值含义,这个引用变量如何能想普通变量一般赋予其他变量的值呢?
例如如下代码:

int b = 10;
int &a = b;
int c = 20;
a = c;

我们更应该把最后一句解释为 a 更改为引用 c 呢?还是解释为把 a 的值改变为 c 的值呢?
直觉告诉我们,应该是后者。而事实也正是如此。因此,让我们把这条规则再来念上三遍:
引用在初始化后不能转而引用其他变量!!
引用在初始化后不能转而引用其他变量!!
引用在初始化后不能转而引用其他变量!!

你可以这样认为:引用变量在初始化后就变成了一个普通变量。 也因此,可以引用变量引用一个引用变量也是允许的:

int a = 0;
int &b = a;
int &c = b;

这样,a b c 就是同一个变量了。


使用引用

说完了如何创建一个引用变量,我们来探索一下如何使用它。这一小节的内容有些杂,主要是因为它会同很多C语言或C++语言的机制产生作用。例如,引用会被 const 修饰,引用作为参数或返回值、引用之作用于对象等等。下面我们来分别介绍一下。

const和引用

首当其冲 首先介绍的是 const 关键字在引用变量中的使用。众所周知,const 关键字本意是修饰变量为常量,意味着它不会被修改。那么,如果我们将 const 关键字使用在引用变量的声明,引用变量会产生什么样的性质呢?
在前面,我们讨论过引用变量的再赋值问题,说到引用变量一旦初始化就不能再转而引用其他的变量。因此,引用并不会像指针那样产生两个可被 const 修饰的部位(也就是说一个引用只能始终指向一个变量,这点是已经存在 const 性质的)。那么剩下的可被修饰地方,就是它的值了。
简单说,就是被 const 修饰的引用变量作为常量存在,其值不能够发生改变。

但是这就产生一个问题了,如果引用变量是被 const 修饰的,而被引用变量不是,会发生什么事情呢?
看如下代码:

int x - 9;
const int &y = x;
x = 5;
y = 15;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值