我了解指针与引用的语法和一般语义,但是我应该如何确定何时在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(...)
。如果这不是您要执行的操作,请查看声明。