C ++函数参数列表中的&是什么意思?


What does & in C++ function arguments list mean?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What are the differences between pointer variable and reference variable in C++?
What does a function prototype mean with an ampersand in it?

据我所知,

1
void bar(int &x) { ... }

似乎是指通过x。但是在C++中,已经有指针等了。那有什么区别呢

1
2
3
void bar(int *x) { ... }
// then call by
bar(&x);

除了时间更长…我还注意到,如果我使用第二种方法,我需要使用->,而不是.,如果我通过struct……为什么?


StruouUp给出C++引用的原因是运算符重载。

http://www.stroustrup.com/bs_faq2.html指针和引用

在您的示例函数bar中,用户是否必须将其称为bar(&x)(因为它需要指针),或者是否可以使用bar(x)调用它(因为它需要引用),都没有什么大不了的。至少,C程序员认为不是。

然而,当操作符重载被添加到C++时,Stroustrup认为使用带有指针的重载运算符是非常不雅的(他的单词中的"丑陋")。

引用在功能上比指针有一些优势,例如临时对象可以绑定到常量引用,但不能对其应用&运算符。因此,pass-by const引用函数有时会将调用方保存一行代码(以创建变量),而不是将其pass-by pointer保存为const等价物。

因此,一种可能的约定是,当函数计划在返回后将地址存储到某个地方以供将来使用时接受指针,而在不存储地址时接受引用。它不会阻止所有可能的创建悬空指针/引用的方法,但会捕获一个大的指针/引用。但是,在编写函数式代码时,它确实会带来不幸的后果,因此并非所有人都能做到。

I also noticed if I use the 2nd method, I need to use -> as opposed to
. if I pass in a struct... why?

它只是从c..继承的语法,用于访问结构的成员,->通过指向结构的指针访问成员。在C语言中,您只能使用带指针的->,并且不能使用带指针的.。因此,不需要严格使用不同的符号,它只是帮助代码更易于阅读,以便有提醒。例如,如果同一个符号.同时用于这两个符号,那么(*ptr).memberptr.member的含义相同,这可能会令人困惑。

在C++中,差异对语言是有用的。您可以为类类型重载operator->,例如智能指针。但是类类型可以让成员通过.访问。所以some_smart_ptr->get();的意思是"在智能指针的引用上调用get()函数",而some_smart_ptr.get()的意思是"在智能指针上调用get()函数"。


引用基本上是一个具有恒定地址的指针,因此它与按地址调用具有相同的效果。这主要是语法上的不同:通过引用调用更方便,因为从调用站点来看,它就像是通过值调用一样(除了必须小心临时性)。