函数调用中 * 和 & 运算符之间的区别

Difference between the * and & operator in function calls

本文关键字:之间 区别 运算符 函数调用      更新时间:2023-10-16

可能重复:
C++函数:符号与星号
与参数组合的各种符号(*、&等)之间有什么区别?

我想知道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."
}

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

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

&函数参数专门表示此参数由引用传入(传统编译器将其作为指针实现),这就是为什么您在main()中看到此赋值的效果。static与此无关。

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

test本身(没有&)将向函数传递字符串的副本,而&意味着它将传递引用。

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