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