Разница между * и оператором & в вызовах функций

Возможный дубликат:
Функции 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."
}

Во-первых, почему & Оператор позволяет мне присвоить значение, как если бы это был указатель (присвоение ему значения, которое сохраняется в RAII и области видимости функции foo() когда это не указатель) как это можно распечатать в моем main() функционировать, хотя это не так static? Я предполагаю, что это не указатель, потому что я могу получить доступ к size() метод с помощью . оператор вместо -> который используется для указателей.

Во-вторых, какая разница между использованием & оператор в параметре функции против использования * оператор? Это даже отличается от простой переменной типа std::string param? Похоже, так называетсяfoo(test) вместо foo(&test)).

2 ответа

Решение

& Параметр функции, в частности, означает, что этот параметр передается по ссылке (традиционно компиляторы реализуют это как указатель), поэтому вы видите эффект этого назначения в вашем main(),static не имеет ничего общего с этим.

Разница в объявлении параметра функции с помощью & а также * является то, что второй позволяет NULL (или несуществующий или просто неверный адрес) для передачи, пока & гарантирует, что есть реальный объект, на который ссылается аргумент этой функции. кроме того, оба обеспечивают похожую функциональность, позволяя изменять исходный объект через его ссылку.

test самостоятельно (без &) передаст копию в строку функции, в то время как & означает, что он пройдет ссылку.

К вашему сведению: когда вам не нужна ссылка, передовой опыт требует передачи всех объектов в виде константных ссылок.

Другие вопросы по тегам