对于习惯使用C进行开发的程序员来说,在看到C中出现的&符号,可能会犯迷糊,因为在C语言中这个符号表示了取地址符,但是在C中,它除了取地址,还有其它的用途,叫做引用(reference),引用是C++的新特性。

一、引用的概念

引用就是变量的别名,对引用的操作与对变量直接操作完全一样。

引用的声明方法:

1
类型标识符 &引用名=目标变量名;

例如:

1
2
3
int a; 
int &ra=a; // 定义引用ra,它是变量a的引用,即别名。
ra=1; 等价于 a=1;

说明:

1)&在此不是求地址运算,而是起标识作用。

2)类型标识符是指目标变量的类型。

3)声明引用时,必须同时对其进行初始化,否则编译器会报错,所以,不能再把引用名作为其他变量名的别名。

4)引用声明后,相当于目标变量名有两个名称。

5)声明一个引用,不是新定义了一个新的变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。

6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法对数据建立引用。

7)引用可以用const修饰,表示只读,用这种方式声明的引用,不能通过引用对目标变量的值进行修改。

1
2
3
4
int a;
const int &ra=a;
a=10; // 可以
ra=10; // 不行

二、引用的应用

引用的主要作用就是作为函数的参数。

在C语言中函数参数是值传递,如果有大块数据作为参数传递的时候,采用的方案是传递数据的地址。

在C++中,又增加了一种同样有效率的选择,就是引用。

示例(book212.cpp)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
* 程序名:book212.cpp,此程序用于演示C++的引用
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>

void func(int *a) // a是一个指针变量
{ *a=20; }

void func(int &ra) // ra是一个引用
{ ra=30; }

int main ()
{
int ii=0;

func(&ii); // 传递变量的地址
printf("1 ii=%d\n",ii);

func(ii); // 引用
printf("2 ii=%d\n",ii);
}

运行效果

在这里插入图片描述

从以上的示例可以看出,传递引用给函数与传递指针的效果是一样的。这时,被调函数的参数就成为调用者调函数中的变量或对象的一个别名来使用,所以在被调函数中对引用的操作就是对目标变量的操作。

在很多资料中,把引用的优点过于夸大,在我看来,引用的好处就是调用函数的时候,不用填写取地址符&,子函数中也不写取变量符*,结构体和类不用->取成员。但我更倾向传递地址的方式,更直观,不管是在函数内部还是函数被调用的地方,一眼就能清楚是否是地址。

引用还可以作为函数的返回值,但我不建议这么用,我实在看不出这样做有什么好处,那就没必要把事情搞得那么复杂,所以这里就不介绍了。

三、课后作业

编写示例程序,把本章节介绍的知识点全部演示一遍,用程序演示可以加深您的理解和映象。

四、版权声明

C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
来源:C语言技术网(www.freecplus.net
作者:码农有道