【问题标题】:What does & in C++ function arguments list mean? [duplicate]C++ 函数参数列表中的 & 是什么意思? [复制]
【发布时间】:2012-10-19 09:31:44
【问题描述】:

可能重复:
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...为什么?

【问题讨论】:

  • 很多骗子。这是一个参考,是的。
  • 我似乎你可能需要阅读一些关于 C++ 的内容,谷歌搜索“c++ 参考”将引导你找到很多优秀的文档和概念解释。

标签: c++


【解决方案1】:

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

http://www.stroustrup.com/bs_faq2.html#pointers-and-references

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

但是,当 C++ 中添加运算符重载时,Stroustrup 认为使用带指针的重载运算符非常不雅(用他的话来说“丑陋”)。

与指针相比,引用在功能上具有一些优势,例如临时对象可以绑定到 const 引用,但您不能对其应用 & 运算符。因此,与通过指针传递到常量的等效函数相比,传递常量引用函数有时会为调用者节省一行代码(以创建变量)。

出于这个原因,一种可能的约定是,当您的函数计划将地址存储在某处以供将来使用时,它接受一个指针,当它没有时接受一个引用。它不会阻止创建悬空指针/引用的所有可能方法,但它会捕获一个大的。但是,在编写函数式代码时,它确实会产生不幸的后果,因此并不适合所有人。

我还注意到,如果我使用第二种方法,我需要使用 -> 而不是 .如果我传入一个结构......为什么?

这只是继承自 C 的语法。. 访问结构的成员,-> 通过指向结构的指针访问成员。在 C 中,您可以-> 与 LHS 上的指针一起使用,并且您可以从不. 与 LHS 上的指针一起使用。所以对不同的符号没有严格的要求,它只是有助于使代码更具可读性以具有提醒。例如,如果相同的符号. 用于两者,那么(*ptr).member 的含义与ptr.member 的含义相同,这可能会造成混淆。

在 C++ 中,这种差异对语言很有用。您可以为类类型重载operator->,例如智能指针。但是类类型可以使用. 访问成员。所以some_smart_ptr->get(); 表示“在智能指针的引用上调用get() 函数”,而some_smart_ptr.get() 表示“在智能指针上调用get() 函数”。

【讨论】:

    【解决方案2】:

    引用基本上是一个带有常量地址的指针,因此它与按地址调用的效果相同。主要是语法上的不同:通过引用调用更方便,因为从调用站点就好像您在按值调用一样(除非您必须小心使用临时变量)。

    【讨论】:

      猜你喜欢
      • 2012-12-12
      • 1970-01-01
      • 2013-08-12
      • 2011-07-08
      • 2014-04-18
      • 2012-12-10
      • 2014-02-18
      • 2013-10-31
      相关资源
      最近更新 更多