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

时间:2012-07-14 19:34:12

标签: c++ function dereference address-operator

  

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

我想知道C ++函数调用中地址运算符&和deference运算符*之间的区别。例如,采取以下功能

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."
}

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

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

test自己(没有&)会将副本传递给字符串到函数,而&表示它会传递引用。

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