可能重复:
What are the differences between pointer variable and reference variable in C++?
What does a function prototype mean with an ampersand in it?
据我了解,
void bar(int &x) { ... }
似乎是指通过引用传递x
。但在C ++中,已有指针等。
void bar(int *x) { ... }
// then call by
bar(&x);
除了它更长的事实......我还注意到如果我使用第二种方法,如果我传入->
,我需要使用.
而不是struct
......为什么?
答案 0 :(得分:3)
Stroustrup引入C ++引用的原因是运算符重载。
http://www.stroustrup.com/bs_faq2.html#pointers-and-references
在您的示例函数bar
中,用户是否必须将其称为bar(&x)
(因为它需要一个指针),或者可以使用bar(x)
调用它,这没什么大不了的(因为它需要参考)。至少,C程序员认为不是。
然而,当操作符重载被添加到C ++时,Stroustrup认为使用带指针的重载操作符非常不优雅(在他的话中“丑陋”)。
引用在指针功能方面有一些优势,例如临时对象可以绑定到const引用,但是不能将&
运算符应用于它。因此,const-by-const-reference函数有时会向调用者保存一行代码(用于创建变量),而不是传递指针到const等效函数。
出于这个原因,一个可能的约定是当你的函数计划将地址存储在某个地方以备将来使用后返回时接受一个指针,而当它没有返回时引用它。它并没有阻止创建悬空指针/引用的所有可能方法,但它捕获了一个很大的方法。但是,在编写功能样式代码时确实会产生不幸的后果,因此并不适合所有人。
我也注意到如果我使用第二种方法,我需要使用 - >而不是 。如果我传入一个结构...为什么?
它只是继承自C. .
的语法来访问结构的成员->
以通过指向结构的指针来访问成员。在C中,您只能 使用->
在LHS上使用指针,并且永远不会使用.
在LHS上使用指针。因此,不需要不同的符号,它只是有助于使代码更具可读性。例如,如果两者使用相同的符号.
,则(*ptr).member
与ptr.member
的含义相同,这可能会让人感到困惑。
在C ++中,差异对语言很有用。您可以为类类型重载operator->
,例如智能指针。但类类型可以使用.
访问成员。所以some_smart_ptr->get();
表示“在智能指针的referand上调用get()
函数”,而some_smart_ptr.get()
表示“在智能指针上调用get()
函数”。
答案 1 :(得分:1)
引用基本上是一个带有常量地址的指针,因此它与通过地址调用具有相同的效果。它主要是语法上的差异:通过引用调用更方便,因为从调用站点开始,它就像你按值调用一样(除了你必须小心临时)。