【发布时间】:2011-10-26 20:45:37
【问题描述】:
我了解指针与引用的语法和一般语义,但我应该如何决定何时在 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's C++ Style Guide 的答案,因为它们提出了“引用可能令人困惑,因为它们具有值语法但指针语义”的观点。
由于清理不应为 NULL 的指针参数需要额外的工作(例如,add_one(0) 将调用指针版本并在运行时中断),从可维护性的角度来看,在必须存在对象的地方使用引用是有意义的,尽管失去语法清晰度是一种耻辱。
【问题讨论】:
-
您似乎已经决定何时使用哪一个。就个人而言,我更喜欢传入我正在操作的对象,无论我是否正在修改它。如果一个函数接受一个指针,这告诉我它正在作用于指针,即将它们用作数组中的迭代器。
-
@Schnommus:很公平,我主要使用 TextMate。不过,我认为最好一目了然。
-
add_one(a);不清楚a会被修改怎么办?它在代码中说:add one. -
@connec:Google C++ 风格指南并不是一个好的 C++ 风格指南。它是使用 Google 的旧 C++ 代码库的风格指南(即对他们的东西有好处)。接受基于此的答案对任何人都没有帮助。只需阅读您的 cmets 和解释,您就已经带着既定的观点提出了这个问题,并且只是在寻找其他人来确认您的观点。因此,您的问题和答案都基于您想要/期望听到的内容。
-
这只是通过命名方法
addOneTo(...)来解决的。如果这不是您想要做的,只需查看声明即可。