Когда использовать ссылки и указатели
Я понимаю синтаксис и общую семантику указателей по сравнению со ссылками, но как я должен решить, когда более или менее целесообразно использовать ссылки или указатели в 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++)? Есть ли какие-либо проблемы с производительностью с одним или другим?
EDIT (УСТАРЕВШИЙ):
помимо разрешения нулевых значений и работы с необработанными массивами, похоже, выбор сводится к личному предпочтение. Я принял ответ ниже, что ссылки руководство по стилю C++ от Google, поскольку они представляют представление о том, что " ссылки могут быть запутанными, поскольку они имеют синтаксис значений, но семантику указателя.".
из-за дополнительной работы, необходимой для очистки аргументов указателя, которые не должны быть NULL (например,add_one(0) вызовет версию указателя и остановится во время выполнения), имеет смысл с точки зрения ремонтопригодности использовать ссылки, где должен присутствовать объект, хотя это позор, чтобы потерять синтаксической ясности.
Comments