Я розумію синтаксис та загальну семантику покажчиків порівняно з посиланнями, але як я повинен вирішити, коли більш-менш доцільно використовувати посилання чи покажчики в API?
Звичайно, для деяких ситуацій потрібна та чи інша ( operator++
потребує довідкового аргументу), але в цілому я вважаю, що я вважаю за краще використовувати покажчики (і const покажчики), оскільки синтаксис зрозумів, що змінні передаються деструктивно.
Наприклад у наступному коді:
void add_one(int& n) { n += 1; }
void add_one(int* const n) { *n += 1; }
int main() {
int a = 0;
add_one(a); // Not clear that a may be modified
add_one(&a); // 'a' is clearly being passed destructively
}
З вказівником завжди (більше) очевидно, що відбувається, тому для API та подібних, де чіткість викликає велике занепокоєння, вказівники не є більш доцільними, ніж посилання? Чи означає це, що посилання повинні використовуватися лише тоді, коли це необхідно (наприклад operator++
)? Чи є якісь проблеми щодо ефективності роботи з тим чи іншим?
РЕДАКТИРУВАННЯ (ЗАРАЗ):
Окрім дозволу NULL значень та роботи з необробленими масивами, схоже, вибір зводиться до особистих переваг. Я прийняв відповідь нижче, що посилається на керівництво по стилю C ++ Google , оскільки вони представляють думку про те, що "Посилання можуть бути заплутаними, оскільки вони мають синтаксис значення, але семантику вказівника".
У зв'язку з додатковою роботою, необхідною для очищення аргументів вказівника, які не повинні бути NULL (наприклад, add_one(0)
буде викликати версію вказівника та перерву під час виконання), з точки зору ремонтопридатності має сенс використовувати посилання там, де ОБОВ'ЯЗКОВО повинен бути присутнім, хоча це соромно втратити синтаксичну ясність.
add_one(a);
незрозуміло, що a
це буде змінено? У коді прямо написано: додайте його .
addOneTo(...)
. Якщо це не те, що ви хочете зробити, просто подивіться на декларацію.