引用的定义
引用是一个已存在变量的别名,一旦把引用初始化为某个变量就可以使用该引用名称或者变量名称来指向该变量。
引用与指针的不同
- 不存在空引用,引用必须连接到一块合法的内存。
- 引用只能初始化一次,即引用只能指向一个对象。指针能随时改变指向的对象。
- 引用必须在创建时被初始化。指针可以在任何时间被初始化
引用的创建
int i = 17;
int& r = i;
上面创建的引用读作: “r 是一个初始化为 i 的整型引用”
引用作为函数参数
引用可以作为函数的参数,此时改变形参即改变实参,实例如下:
#include <iostream>
using namespace std;
// 函数声明
void swap(int& x, int& y);
int main ()
{
// 局部变量声明
int a = 100;
int b = 200;
cout << "交换前,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl;
/* 调用函数来交换值 */
swap(a, b);
cout << "交换后,a 的值:" << a << endl;
cout << "交换后,b 的值:" << b << endl;
return 0;
}
// 函数定义
void swap(int& x, int& y)
{
int temp;
temp = x; /* 保存地址 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 x 赋值给 y */
return;
}
以上代码编译执行时会产生如下结果:
交换前,a 的值: 100
交换前,b 的值: 200
交换后,a 的值: 200
交换后,b 的值: 100
引用作为函数的返回值
函数返回引用时,会返回一个指向该返回值的隐式指针,因此函数可以放在赋值语句的左边,实例如下:
#include <iostream>
using namespace std;
double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};
double& setValues( int i )
{
return vals[i]; // 返回第 i 个元素的引用
}
// 要调用上面定义函数的主函数
int main ()
{
cout << "改变前的值" << endl;
for ( int i = 0; i < 5; i++ )
{
cout << "vals[" << i << "] = ";
cout << vals[i] << endl;
}
setValues(1) = 20.23; // 改变第 2 个元素
setValues(3) = 70.8; // 改变第 4 个元素
cout << "改变后的值" << endl;
for ( int i = 0; i < 5; i++ )
{
cout << "vals[" << i << "] = ";
cout << vals[i] << endl;
}
return 0;
}
以上代码输出的结果为:
改变前的值
vals[0] = 10.1
vals[1] = 12.6
vals[2] = 33.1
vals[3] = 24.1
vals[4] = 50
改变后的值
vals[0] = 10.1
vals[1] = 20.23
vals[2] = 33.1
vals[3] = 70.8
vals[4] = 50
返回一个引用时要注意被引用对象的作用域
返回一个引用时,被引用对象不能超出作用域,即返回引用后被引用对象还没有结束生命周期。所以返回一个对局部变量的引用是不合法的,但是,可以返回一个对静态变量的引用。
int& func() {
int q;
//! return q; // 在编译时发生错误
static int x;
return x; // 安全,x 在函数作用域外依然是有效的
}