引用
引用是已存在变量的别名,定义引用的一般格式为:
类型标识符 &引用变量名 = 变量名;
&是引用运算符,在定义时必须用已经存在的变量对其初始化,引用类型与它所引用的变量类型相同。一个引用定义后,对引用的操作等价于对它所引用的变量的操作。
int a;
int &ref = a;
ref = 10; //等价于a = 10
系统并不为引用分配内存空间,引用和它所引用的变量使用同一内存空间。
引用的主要作用是作为函数参数和函数的返回值。如果在定义时用const修饰,则定义的是常引用,并且常引用的值不允许修改。
int a = 10;
const int &ref = a;
ref = 5; //ERROR:ref为常引用,不允许被修改
a = 5; //通过a本身修改自己的值是可以的
常引用作为函数参数时说明该引用的值不允许在函数内修改
下面是一个常见的swap()函数,其中就用到了引用。
#include <iostream>
using namespace std;
void swap1(int a, int b)
{
a = a + b;
b = a - b;
a = a - b;
}
void swap2(int &a, int &b)
{
a = a + b;
b = a - b;
a = a - b;
}
int main()
{
int x = 10, y = 20;
cout << "交换前:";
cout << "x = " << x << ",y=" << y << endl;
swap1(x, y);
cout << "交换后:";
cout << "x = " << x << ",y=" << y << endl;
cout << "交换前:";
cout << "x = " << x << ",y=" << y << endl;
swap2(x, y);
cout << "交换后:";
cout << "x = " << x << ",y=" << y << endl;
return 0;
}
swap1()原因是x和y在函数swap()1内为按值传递,按值传递时,函数不会访问当前调用的实参。函数处理的值是它本地的拷贝,这些拷贝被存储在运行栈中,因此改变这些值不会影响实参的值。一旦函数结束了,函数的活动记录将从栈中弹出,这些局部值也就消失了。
而在swap2()中,用了&运算符,则a和b是实参x和y的别名,交换的是本身的值。