Рассмотрим этот пример:
void MyFunction(int &x){...}
void MyOtherFunction(int *x){...}
int main()
{
int my_variable = 10;
MyFunction(my_variable);
MyOtherFunction(&my_variable);
}
Правильно ли я сказал, что оба эти метода передают переменную по ссылке (т.е. не создают копию), и единственное отличие состоит в том, что MyOtherFunction получает указатель?
Вы правы, когда говорите, что не копируете my_variable
, но указатель это не ссылка, это два набора разных типов.
Например, указатель может быть нулевым, и вы можете вызвать MyOtherFunction(nullptr)
,
Да, нет копии. Передача указателя означает, что вы можете передать нулевой ptr, а при использовании ссылки вы должны передать действительный объект.
Для int, float и простых переменных передача по значению не дороже, при условии, что вам не нужно изменять внутри функции переданный параметр.
В своих примерах вы никогда не копируете my_variable
(хотя вы копируете указатель при вызове void MyOtherFunction(int *x){...}
, но это нормально).
Важное различие между этими двумя функциями заключается в том, что MyFunction(int &x)
является правильной ссылкой на C ++ и никогда не будет нулевым (в обычном коде), тогда как вы можете передать nullptr MyOtherFunction(int *x)
, и это должно быть проверено во время выполнения. Версия указателя также может быть переназначена внутри MyOtherFunction
как требуется.
Вы правы. В обоих вызовах вы передаете переменную по ссылке. Однако этот термин по ссылке в C ++ отличается от того же термина в C.
В Си, когда кто-то говорит, что передал аргумент по ссылке, это означает, что он передал указатель на переменную.
В C ++ ссылки имеют новое значение. Они являются частью спецификации языка. Поэтому, когда кто-то говорит, что передал аргумент по ссылке, обычно это означает, что соответствующий параметр объявлен как ссылка. 🙂
Передача по ссылке является псевдонимом orignal object
, Передача по указателю создает дополнительную переменную для хранения адреса original object
,