对于习惯使用C进行开发的程序员来说,&符号是取地址符,但是在C++中,它除了取地址,还有其它的用途,叫做引用(reference),引用是C++的新特性。

一、引用的概念

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

引用的声明方法:

  数据类型 &引用名=目标变量名;

例如:

  int ii;
  int &rii=ii;  // 定义引用rii,它是变量ii的引用,即别名。
  rii=1;  等价于  ii=1;

说明:

1)&在此不是求地址运算,而是声明引用。

2)数据类型可以是C语言的基本数据类型,也可以是结构体和类等构造类型。

3)引用在声明的时候必须对其进行初始化(指向目标变量名),否则编译器会报错。

4)引用初始化之后,不能再用作其他变量名的别名。

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

6)不能建立数组的引用,因为数组是多个变量的集合。

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

  int ii;
  const int &rii=ii;
  ii=10;    // 可以
  rii=10;   // 不行

二、引用的应用

1、用于函数的参数

在C语言中函数参数是值传递,如果数据量比较大,采用的方法是传递数据在内存中的地址以提高效率。在C++中,引用也具备传递地址相同的效率。

示例(book212.cpp)

/*
 * 程序名: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);
}

运行效果

image.png

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

2、用于函数的返回值

引用用于函数的返回值,函数的声明如下:

数据类型 &函数名(参数列表);

示例(book213.cpp)

/*
 * 程序名:book213.cpp,此程序用于演示用于函数的返回值的引用
 * 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
 
int value;  // 定义一个全局变量。
 
int fun1(int ii); // 函数的返回值是int
int &fun2(int ii); // 函数的返回值是int引用
 
int main()
{
  int aa=fun1(10);
  printf("aa=%d\n",aa);
 
  // int &bb=fun1(10);
  // printf("bb=%d\n",bb);
 
  int cc=fun2(20);
  printf("cc=%d\n",cc);
 
  int &dd=fun2(20);
  printf("dd=%d\n",dd);
}
 
int fun1(int ii) // 函数的返回值是int
{
  value=10+ii;
  return value;
}
 
// 函数的返回值是int引用
int &fun2(int ii)
{
  value=20+ii;
  return value;
}

运行效果

image.png

引用用于函数的返回值时,有以下注意事项:

1)不能返回函数内部局部变量的引用,因为局部变量会在函数返回后被销毁,皮之不存,毛将焉附?

2)不能返回函数内部动态分配内存的引用,会存在空间无法释放的情况。

3)经常用于返回类成员变量的引用,采用const约束可以防止在类的外部修改成员变量的值。

三、应用经验

引用的出现纯粹是为了优化指针的使用,而提出的语法层面的处理,其实现原理上完全等价于指针,也不能完全避免内存复制。

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

四、课后作业

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

五、版权声明

C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

来源:C语言技术网(www.freecplus.net

作者:码农有道

 


C语言技术网(www.freecplus.net),粤ICP备19156379号

友情链接: 猿说编程    程序分享   

点击关闭