何时使用引用与指针
我理解指针与引用的语法和一般语义,但是我应该如何决定何时适合在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++
)? 是否有任何性能问题与其中一个?
编辑(OUTDATED):
除了允许NULL值和处理原始数组外,似乎选择归结为个人偏好。 我已经接受了下面引用Google的C ++风格指南的答案,因为它们提出了“引用可能会令人困惑,因为它们具有值语法,但是指针语义。”。
由于需要额外的工作来清理不应该为NULL的指针参数(例如, add_one(0)
将在运行时调用指针版本和中断),所以从可维护性的角度来看,使用引用必须存在对象丢失句法清晰度是一种耻辱。
无论你身在何处,都可以使用参考,指针。
直到你不能,避免指针。
原因是指针会使事情难以遵循/阅读,不太安全,而且操作远比其他任何构造更危险。
所以经验法则是只有在没有其他选择时才使用指针。
例如,返回一个指向对象的指针是一个有效的选项,当函数在某些情况下可以返回nullptr并且假定它会。 也就是说,更好的选择是使用类似boost::optional
东西。
另一个例子是使用指向原始内存的指针来进行特定的内存操作。 这应该隐藏在代码的非常窄的部分中,以帮助限制整个代码库中的危险部分。
在你的例子中,使用指针作为参数没有意义,因为:
nullptr
作为参数,你将进入undefined-behavior-land; 如果函数的行为不得不使用或不使用给定的对象,那么使用指针作为属性表明你可以传递nullptr
作为参数,并且对于函数来说是很好的。 这是用户和实施之间的合同。
性能完全一样,因为引用是作为指针在内部实现的。 因此你不必担心这一点。
关于何时使用引用和指针没有普遍接受的约定。 在少数情况下,您必须返回或接受引用(例如复制构造函数),但除此之外,您可以随意按照自己的意愿进行操作。 我遇到的一个相当常见的惯例是在参数必须引用现有对象时使用引用,而在NULL值正确时引用指针。
一些编码约定(如Google的)规定应该总是使用指针或const引用,因为引用有一些不清楚的语法:它们具有引用行为,但是具有值语法。
从C ++ FAQ Lite -
尽可能使用参考,必要时使用指示。
只要您不需要“重新设置”,引用通常优先于指针。 这通常意味着引用在类的公共接口中最有用。 引用通常出现在对象的皮肤上,指向内部的指针。
上述例外是函数的参数或返回值需要一个“标记”引用 - 一个不引用对象的引用。 这通常最好通过返回/获取指针来完成,并且赋予NULL指针这种特殊意义(引用必须始终是别名对象,而不是取消引用的空指针)。
注意:旧的C语言程序员有时不喜欢引用,因为它们提供的引用语义在调用者的代码中并不明确。 但是,经过一些C ++经验,人们很快意识到这是一种信息隐藏,这是一种资产而不是责任。 例如,程序员应该用问题的语言来编写代码,而不是使用机器的语言。
链接地址: http://www.djcxy.com/p/3529.html