为什么选择&符号作为C ++中引用的符号?

时间:2009-03-21 22:51:21

标签: c++ c reference history

有没有人知道为什么选择&符号作为表示C ++中引用的方式?

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

5 个答案:

答案 0 :(得分:12)

除了我一般同意的Earwicker的回应。我也会推测,因为&是“地址”运算符,它有点合适。由于引用在很多方面类似于通过地址而不是通过

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

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

这只是猜测。

答案 1 :(得分:7)

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

答案 2 :(得分:2)

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

答案 3 :(得分: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

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

int &a; // &a is valid

重要的一点是,& 对引用表示的表达式有效:对于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)

答案 4 :(得分:2)

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