Я понимаю синтаксис и общую семантику указателей по сравнению со ссылками, но как мне решить, когда более или менее целесообразно использовать ссылки или указатели в 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 и работы с необработанными массивами, кажется, что выбор сводится к личным предпочтениям. Я согласился с ответом ниже, который ссылается на Руководство по стилю Google C ++ , поскольку в нем представлено мнение, что «Ссылки могут сбивать с толку, поскольку они имеют синтаксис значений, но семантику указателей».
Из-за дополнительной работы, необходимой для очистки аргументов указателя, которые не должны быть равны NULL (например add_one(0)
, вызовет версию указателя и прервется во время выполнения), имеет смысл с точки зрения сопровождения использовать ссылки, где ДОЛЖЕН присутствовать объект, хотя это позор. потерять синтаксическую ясность.
add_one(a);
неясно, что a
будет изменено? Это говорит прямо в коде: добавьте один .
addOneTo(...)
. Если это не то, что вы хотите сделать, просто посмотрите на объявление.