Разница между * и оператором & в вызовах функций
Возможный дубликат:
Функции 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
самостоятельно (без &
) передаст копию в строку функции, в то время как &
означает, что он пройдет ссылку.
К вашему сведению: когда вам не нужна ссылка, передовой опыт требует передачи всех объектов в виде константных ссылок.