引用变量是c++新增的一种复合类型,是已定义变量的别名。
一,创建引用变量
- c和c++使用&符号来指示变量的地址,c++给&符号赋予了另一个含义,将其用来声明引用。
#include <iostream>
using namespace std;
int main()
{
int val = 100;
int &ref = val; //声明引用,指向int变量的引用。
cout << "val = " << val;
cout << ", ref = " << ref << endl;
ref++;
cout << "val = " << val;
cout << ", ref = " << ref << endl;
cout << "val address = " << &val;
cout << ", ref address = " << &ref << endl;
return 0;
}
运行结果:从中可知,val和ref的值和地址都相同,都是指同一块内存,ref++操作将一个有两个名称的变量加1
val = 100, ref = 100
val = 101, ref = 101
val address = 0x7ffecb512cf4, ref address = 0x7ffecb512cf4
- 必须在声明引用变量时进行初始化
int val = 100;
int &ref; //error: ‘ref’ declared as reference but not initialized
ef = val;
二,将引用用作函数参数
引用经常被用作函数参数,使得函数中的变量名成为调用程序中的变量的别名,这种传递参数的方法为按引用传递,按引用传递允许被调用的函数能够访问调用函数中的变量。
#include <iostream>
using namespace std;
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int x = 10;
int y = 20;
cout << "x = " << x << " " << "y = " << y << endl;
swap(x, y);
cout << "x = " << x << " " << "y = " << y << endl;
return 0;
}
运行结果:x和y的值相互交换。
x = 10 y = 20
x = 20 y = 10
函数调用使用实参初始化形参,因此函数的引用参数被初始化为函数调用函数传递的实参。
三,何时使用引用参数
这只是一些指导原则,很可能有充分的理由做出其他的选择。
- 对于使用传递的值而不作修改的函数
- 如果数据对象很小,如内置数据类型或小型结构,则按值传递。
- 如果数据对象是数组,则使用指针,并将指针声明为指向const的指针。
- 如果数据对象是较大的结构,则使用const指针或const引用,以提高程序的效率,这样可以节省复制结构所需的时间和空间。
- 如果数据对象是类对象,则使用const引用,传递类对象参数的标准方式是按引用传递。
- 对于修改调用函数中数据的函数。
- 如果数据对象是内置数据类型,则使用指针。
- 如果数据对象是数组,则只能使用指针。
- 如果数据对象是结构,则使用引用和指针。
- 如果数据对象是类对象,则使用引用。