有没有人知道为什么选择&符号作为表示C ++中引用的方式?
AFAIK(虽然我附近没有这本书),Stroustroup没有解释这个选择,我觉得有点奇怪,因为相同的符号已用于C中的地址。
答案 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
从概念上讲,在那些声明中,使用类型(C
,char
,bool
)命名的内容稍后将替换为该类型的表达式。当然,目的是尽可能多地重用现有语言。所以我认为他使用&
:
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;是为了获取某些东西的地址,所以可以在声明中使用。