【问题标题】:Difference between the * and & operator in function calls [duplicate]函数调用中*和&运算符之间的区别[重复]
【发布时间】:2012-07-14 06:26:20
【问题描述】:

可能重复:
C++ functions: ampersand vs asterisk
What are the distinctions between the various symbols (*,&, etc) combined with parameters?

我想知道 C++ 函数调用中地址运算符 & 和尊重运算符 * 之间的区别。比如下面的函数

void foo (std::string& param)
{
     param = "Bar.";
     std::cout << param.size();
}

让我们在 main() 函数中这样调用它......

int main()
{
      std::string test;
      foo(test);          //Why not foo(&test)?
      std::cout << test;  //Prints out the value "Bar."
}

首先,为什么&amp; 运算符允许我像指针一样分配一个值(当它不是指针时,分配一个在函数foo() 的RAII 和范围内幸存的值)因为它即使不是static,也可以在我的main() 函数中打印出来?我假设它不是指针,因为我可以通过使用. 运算符而不是用于指针的-&gt; 来访问size() 方法。

其次,在函数参数中使用&amp; 运算符与使用* 运算符有什么区别?它甚至与像std::string param 这样的普通变量不同吗?它似乎是这样称呼的(foo(test) 而不是foo(&amp;test))。

【问题讨论】:

标签: c++ function dereference address-operator


【解决方案1】:

&amp; 函数参数特别表示该参数是由 reference 传入的(传统上编译器将此作为指针实现),这就是为什么您会在 @987654322 中看到此赋值的效果@。 static 与此无关。

使用&amp;* 向函数声明参数的区别在于,第二个允许传入nullptr(或不存在或只是一个普通的无效地址),而&amp; 保证这个函数的参数引用了一个真实的对象。除此之外,两者都提供了允许通过引用更改原始对象的类似功能。

【讨论】:

    【解决方案2】:

    test 本身(没有&amp;)会将字符串的副本传递给函数,而&amp; 表示它将传递引用。

    仅供参考:当您不需要引用时,最佳实践要求将所有对象作为 const 引用传递。

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 2014-03-28
      • 2021-12-18
      • 2017-12-25
      相关资源
      最近更新 更多