引用(Reference) 是 C++ 相对于 C 语言的又一个扩充,它可以看做是数据的一个别名。引用类似于人的外号(笔名),我们通过别名和原来的名字都能够找到这个人,鲁迅和周树人虽然是两个名字,但是说的是同一个人。
引用(Reference)是一种特殊的变量类型,它为已存在的变量提供了一个别名。引用本身并不占据独立的内存空间,而是与它所引用的变量共享同一块内存地址。
引用的定义方式类似于指针,只是用 & 取代了 *,语法格式为:
数据类型& 引用名 = 已存在的变量名;
通过引用创建出来的变量,我们称之为 引用变量,示例如下:
#include <iostream>
using namespace std;
int main() {
int a = 0;
// 引用,对变量 a 取别名
int& b = a;
int& c = a;
// 也可以给别名 b 再取别名,d 相当于还是 a 的别名
int& d = b;
cout << "a 的地址为:" << &a << ",值为:" << a << endl;
cout << "b 的地址为:" << &b << ",值为:" << b << endl;
cout << "c 的地址为:" << &c << ",值为:" << c << endl;
cout << "d 的地址为:" << &d << ",值为:" << d << endl;
// 修改 d 的值,a、b、c 的值同样会发生变化
d++;
cout << "a 的地址为:" << &a << ",值为:" << a << endl;
cout << "b 的地址为:" << &b << ",值为:" << b << endl;
cout << "c 的地址为:" << &c << ",值为:" << c << endl;
cout << "d 的地址为:" << &d << ",值为:" << d << endl;
return 0;
}
运行结果如下:
a 的地址为:0x65b67ffdd4,值为:0
b 的地址为:0x65b67ffdd4,值为:0
c 的地址为:0x65b67ffdd4,值为:0
d 的地址为:0x65b67ffdd4,值为:0
a 的地址为:0x65b67ffdd4,值为:1
b 的地址为:0x65b67ffdd4,值为:1
c 的地址为:0x65b67ffdd4,值为:1
d 的地址为:0x65b67ffdd4,值为:1
上述代码中演示了 C++ 中引用(Reference) 的概念和特性。
首先,定义整型变量 a,初始值为 0;然后声明 b、c 为 a 的引用(相当于起别名),后面又声明 d 为 b 的引用(也就是 a 的间接引用,相当于仍是 a 的别名)。
这里的关键是:b、c、d 都不是新的变量,它们只是 a 的不同名字,它们共享同一块内存空间,因此打印出的变量地址及变量值是完全相同的。
后面 d++ 使 d 的值自增 1,由于 d 是 a 的引用,这个操作实际上是对 a 的值进行加 1。因此再次打印时:所有变量(a、b、c、d)的地址不发生改变,值都会变成 1
引用变量作为函数参数
在 C 语言教程中,我们学习过通过指针变量作为函数参数,实现两个变量交换值的功能,代码如下:
#include <iostream>
using namespace std;
void swap_ptr(int* num_1, int* num_2) {
int temp = *num_1;
*num_1 = *num_2;
*num_2 = temp;
}
int main() {
// 创建两个变量
int a = 1, b = 2;
cout << "a:" << a << ",b:" << b << endl;
// 调用指针作为参数的 swap 函数
swap_ptr(&a, &b);
cout << "a:" << a << ",b:" << b << endl;
return 0;
}
运行结果如下:
a:1,b:2
a:2,b:1
在 C++ 编程中,引用不仅用于基本的变量别名,通过引用传递函数参数是 C++ 中常用的一种优化手段。
与传统的值传递相比,引用传递可以避免数据的复制,从而提高函数的执行效率。特别是在传递大型对象或结构体时,引用传递的优势更加明显。它允许函数直接访问和修改原始数据,而无需进行数据的复制和回传。代码如下:
#include <iostream>
using namespace std;
void swap_ref(int& num_1, int& num_2) {
int temp = num_1;
num_1 = num_2;
num_2 = temp;
}
int main() {
// 创建两个变量
int a = 1, b = 2;
cout << "a:" << a << ",b:" << b << endl;
// 调用引用变量作为参数的 swap 函数
swap_ref(a, b);
cout << "a:" << a << ",b:" << b << endl;
return 0;
}
运行结果如下:
a:1,b:2
a:2,b:1
在这个示例中,swap_ref 函数通过引用传递了两个整数参数 num_1 和 num_2,也就是说即使 num_1 与 num_2 是函数的形参,但是由于他们是引用变量,也就是相当于是 a、b 的别名,在 swap_ref 函数内调用 num_1 与 num_2 也就相当于调用 a 与 b。所以交换操作直接作用于原始变量上,无需进行数据的复制。