Я понимаю синтаксис и общую семантику указателей по сравнению со ссылками, но как мне решить, когда более или менее целесообразно использовать ссылки или указатели в API?
Естественно, в некоторых ситуациях требуется один или другой ( operator ++
требует ссылочного аргумента), но в целом я считаю, что предпочитаю использовать указатели (и константные указатели), поскольку синтаксис ясен, что переменные передаются деструктивно.
Например в следующем коде:
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)
вызовет версию указателя и прервется во время выполнения), с точки зрения ремонтопригодности имеет смысл использовать ссылки, в которых ДОЛЖЕН присутствовать объект , хотя синтаксическую ясность терять стыдно.
Вы, на которых правильно записанный пример должен быть похожим
void add_one(int& n) { n += 1; }
void add_one(int* const n)
{
if (n)
*n += 1;
}
Вот почему ссылки, предпочтительны, если это возможно...