5

有谁知道为什么选择与号作为 C++ 中表示引用的方式?

AFAIK(虽然我附近没有这本书),Stroustroup 没有解释这个选择,我觉得这有点奇怪,因为相同的符号已经用于 C 中的地址。

4

5 回答 5

12

除了我普遍同意的 Earwicker 的回应。我还推测,由于 & 是“地址”运算符,它有点合适。由于在许多方面的引用就像通过地址而不是传递。

除此之外,获取变量的地址通常被称为“引用”

(是的,我知道引用不必底层使用指针来实现,我指的是它们在概念上的工作方式)。

不过,这只是猜测。

于 2009-03-21T23:06:52.117 回答
7

Stroustrup 总是非常不愿意引入新的保留符号或名称,所以他可能使用它来避免使 C 用户觉得该功能看起来很奇怪。

于 2009-03-21T22:58:27.410 回答
2

谁知道为什么 Stroustrup 会做任何事情,但我的猜测是因为引用参数的实现涉及传递左值的地址,所以 Stroustrup 选择了 C 的 address-of 运算符,因为它可以让 C 程序员对成本模型有正确的认识。

于 2009-03-21T23:28:07.493 回答
2

这是我的理论。我认为这与哪些运算符对符号有效(在语法上)有很大关系。考虑

int a[1]; // a[1] is valid (syntactically)
int *a; // *a is valid
int a(char, bool); // a(<a char>, <a bool>) is valid (function call)
int C::*a; // <a C>.*a is valid

从概念上讲,在这些声明中,以类型 ( C, char, bool) 命名的内容稍后会替换为该类型的表达式。当然,目的是尽可能多地重用现有语言。所以我认为他使用了&

int &a; // &a is valid

重要的是,&仅对引用表示的表达式类型有效: For lvalues。引用是左值(命名变量也是),只能&应用它们:

int &g(); // &g() is valid (taking the address of the referred to integer)
int g(); // &g() is *not* valid (can't apply to temporary int)
于 2009-03-22T00:10:25.600 回答
2

我的想法是指针中使用了 2 个符号:* 和 &。由于 int* 表示指向 int 的指针,可能 Stroustrup 不想引入一个全新的符号。由于引用有点像指针,所以他坚持使用 &。另外,& 以前唯一有效的用法是获取某物的地址,因此可以在声明中使用。

于 2009-03-22T00:24:25.613 回答