Я предпочитаю ссылку вместо указателя, когда:
- Это не может быть нулем
- Нельзя изменить (указать на что-то еще)
- Он не должен быть удален (тем, кто получает указатель)
Некоторые люди говорят, однако, что разница между ссылкой и ссылкой const слишком мала для многих людей и невидима в коде, который вызывает метод (т. Е. Если вы читаете код вызова, который передает параметр по ссылке, вы не можете видеть, является ли это константной или неконстантной ссылкой), и поэтому вы должны сделать ее указателем (чтобы сделать это явным в вызывающем коде, который вы передаете адресу вашей переменной, и поэтому значение вашей переменной может быть изменено вызываемым абонентом).
Лично я предпочитаю ссылку по следующей причине:
- Я думаю, что подпрограмма должна знать, какую подпрограмму она вызывает
- Подпрограмма не должна предполагать, из какой подпрограммы она вызывается.
[1.] Подразумевает, что сделать изменчивость видимой для вызывающей стороны не имеет большого значения, потому что вызывающая сторона уже должна (другими способами) понять, что делает подпрограмма (включая тот факт, что она изменит параметр).
[2.] Подразумевает, что если это указатель, то подпрограмма должна обрабатывать возможность того, что параметр является нулевым указателем, который может быть лишним и бесполезным кодом IMO.
Более того, всякий раз, когда я вижу указатель, я думаю: «кто и когда удалит это?», Поэтому, когда / где владение / срок действия / удаление не является проблемой, я предпочитаю использовать ссылку.
Для чего бы это ни стоило, я имею привычку писать const-правильный код: поэтому, если я заявляю, что метод имеет неконстантный ссылочный параметр, тот факт, что он неконстантный, имеет значение. Если бы люди не писали код с правильной константой, то, возможно, было бы сложнее сказать, будет ли параметр изменен в подпрограмме, и аргумент для другого механизма (например, указатель вместо ссылки) будет немного сильнее.