Данная статья практически на 100% отражает и мой подход к использованию ссылок и указателей, рекомендую к ознакомлению:
http://eao197.blogspot.ru/2015/11/progthoughts-c.html
Тезисно:
void f(const T &p)
ожидает реально существующий объект, но не изменяет его;void f(T &p)
ожидает реально существующий объект и изменяет его;void f(const T *p)
ожидает объект илиnullptr
, если объект существует, то не изменяет его;void f(T *p)
ожидает объект илиnullptr
, если объект существует, то изменяет его;void f(unique_ptr<T> p)
ожидает объект илиnullptr
; если объект существует, то забирает ответственность за его удаление;void f(shared_ptr<T> p)
ожидает объект илиnullptr
; если объект существует, то разделяет владение этим объектом (что дает право функцииf()
сохранитьp
у себя для дальнейшего использования или передать кому-то еще).