Являются ли оба объявления метода «передачей по ссылке»? - PullRequest
3 голосов
/ 03 июня 2011

В чем разница между этими двумя способами написания функции в C ++?Они оба "проходят по ссылке"?Под «передачей по ссылке» я подразумеваю, что функция имеет возможность изменять исходный объект (если нет другого определения, но это мое намерение).

Насколько я понимаю, когда вы вызываете f1, выпередать "синоним" исходного объекта.Когда вы вызываете f2, вы передаете указатель на объект.При вызове f2 создается новый объект *, тогда как при вызове f1 ничего не происходит?

f1 (Object& obj) {}
f2 (Object* obj) {}

Спасибо!

Ответы [ 5 ]

3 голосов
/ 03 июня 2011

Они оба по ссылке в общем смысле, но эта фраза обычно не используется для описания версии указателя из-за возможной путаницы с ссылочными типами C ++ .

3 голосов
/ 03 июня 2011

Ваше понимание верно.

Технически, f2 передается по значению, а значение является указателем, но вы можете использовать эту копию указателя для изменения объекта, на который указывает указатель.

2 голосов
/ 03 июня 2011

В чем разница между этими двумя способами написания функции в C ++? f1 передает объект по ссылке, f2 передает указатель по значению. Оба имеют возможность изменять объект f1 напрямую через ссылку и f2 путем разыменования указателя.

При вызове f2 создается ли новый объект *, тогда как при вызове f1 ничего не происходит? f2 может выделить новый объект по этому адресу или использовать уже выделенный объект по этому адресу в зависимости. Однако передача указателя по значению не вызовет new, это будет просто копия указателя, которая может указывать или не указывать на действительный выделенный объект.

Проверьте ссылку на вики, опубликованную pst. * 1010 в качестве комментария.

1 голос
/ 04 июня 2011
f1 (Object& obj) {}

Когда вы звоните f1, например f1(o1):

  • obj становится другим именем для o1 ( псевдоним)), вот и все.Так что o1 это просто псевдоним для obj;они имеют одинаковый адрес (вы можете проверить, что &obj==&o1 это true)

f2 (Object* obj) {}

Когда вы звоните f2, например f1(&o1):

  • obj - создано и инициализировано с &o1;это похоже на:
 f2(){
    Object* obj=&o1; // just for understanding what happens when you call f2(&o1)
    ...
1 голос
/ 03 июня 2011

Указатель может быть нулевым, если ссылка не может.

См:

Каковы различия между переменной указателя и ссылочной переменной в C ++?

...