请问C++中的引用符号“&”到底怎么使用?

2024-12-31 21:19:39
推荐回答(1个)
回答1:

按照 C 语言比较优雅的「声明模仿使用」规则:
int foo; // foo 是 int,所以 foo 的类型是 intint *foo; // *foo 是 int,所以 foo 的类型是 int 指针int foo[42]; // foo[42] 是 int,所以 foo 的类型是 int 数组int foo(); // foo() 是 int,所以 foo 的类型是返回 int 的函数

那么 C++ 的「引用」呢:
int ?foo?; // 怎样的「?foo? 是 int」,才能让 foo 是一个对 int 的引用呢?
按照「声明模仿使用」的规则,我们应该参考「如何使用引用」,但是坑爹的是,int 引用的用法实际上和 int 没什么两样:
int foo;int& ref = foo;foo = 4; // 使用 intref = 2; // 使用 int 引用
所以理论上,如果按照 C 语言的规则,引用的声明方法应该是:
int ref; // Error: 瞎子都看得出来的歧义

所以,C 语言的传统声明规则已经没法解决 C++ 的引用该如何声明的问题了。此时问题就变成了:如何在尽可能遵守 C 语言规则的前提下,把 C++ 的引用声明出来?

那么回到 C 语言,你会发现:

A pointer type may be derived from a function type, an object type, or an incomplete
type, called the referenced type. A pointer type describes an object whose value
provides a reference to an entity of the referenced type.
以上引用自 C99 §6.2.5/20,歌词大意是:
可以从若干中类型中推导出「指针类型」,指针类型所指向的类型称作「被引用类型」。指针类型的作用为「提供被引用类型对象的引用」。你看,C 语言里也有「引用」的概念,这也是为什么我们常把「*p」读作「将 p 解除引用」。

有了这样的背景情报,既然 * 是「解除引用」,那么用来取地址的 & 就可以理解为「进行引用」。所以,如果一定要从 C 语言的资产中找一个符号来区分「int」和「int 引用」,那么最直观的显然是 & 无误了。