Когда использовать ссылки или указатели

Я понимаю синтаксис и общую семантику указателей по сравнению со ссылками, но как мне решить, когда более или менее целесообразно использовать ссылки или указатели в 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) вызовет версию указателя и прервется во время выполнения), с точки зрения ремонтопригодности имеет смысл использовать ссылки, в которых ДОЛЖЕН присутствовать объект , хотя синтаксическую ясность терять стыдно.

365
задан Peter Mortensen 12 May 2017 в 03:17
поделиться

1 ответ

Вы, на которых правильно записанный пример должен быть похожим

void add_one(int& n) { n += 1; }
void add_one(int* const n)
{
  if (n)
    *n += 1;
}

Вот почему ссылки, предпочтительны, если это возможно...

0
ответ дан 23 November 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: