何时使用引用和指针
我理解指针与引用之间的语法和一般语义,但是我应该如何决定在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++
)?是否对其中一种或另一种有任何性能上的顾虑?
编辑(过时):
除了允许空值和处理原始数组之外,选择似乎可以归结为个人偏好。我接受了下面的答案谷歌C+风格指南,因为它们提出了这样的观点:“引用可能会令人困惑,因为它们具有值语法,但具有指针语义。”
由于清理指针参数所需的额外工作,指针参数不应为空(例如,add_one(0)
将调用指针版本并在运行时中断),从可维护性的角度来看,在必须存在对象的地方使用引用是有意义的,尽管失去语法清晰度是可耻的。