为了账号安全,请及时绑定邮箱和手机立即绑定

何时使用引用和指针

何时使用引用和指针

C++
白板的微信 2019-06-21 16:44:22
何时使用引用和指针我理解指针与引用之间的语法和一般语义,但是我应该如何决定在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)将调用指针版本并在运行时中断),从可维护性的角度来看,在必须存在对象的地方使用引用是有意义的,尽管失去语法清晰度是可耻的。
查看完整描述

3 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

在可能的地方使用引用,在必须的地方使用指针。

避免指针,直到你不能。

之所以如此,是因为指针使事物更难跟踪/读取,比任何其他构造都更不安全,也更危险。

因此,经验法则是,只有在没有其他选择的情况下才使用指针。

例如,当函数在某些情况下返回nullptr时,返回对象的指针是一个有效的选项,并且假定它会返回。也就是说,更好的选择是使用类似于boost::optional.

另一个例子是将指向原始内存的指针用于特定的内存操作。应该在代码的非常狭窄的部分隐藏和本地化,以帮助限制整个代码库中的危险部分。

在您的示例中,使用指针作为参数是没有意义的,因为:

  1. 如果你提供

    nullptr

    作为论点,你将进入一个不明确的-行为-土地;
  2. 引用属性版本不允许(不容易发现技巧)1的问题。
  3. 对于用户来说,引用属性版本更容易理解:您必须提供一个有效的对象,而不是可能为NULL的对象。

如果函数的行为必须使用或不使用给定的对象,那么使用指针作为属性意味着可以传递nullptr作为论证,这对函数来说是很好的。这是用户和实现之间的一种契约。


查看完整回答
反对 回复 2019-06-21
?
墨色风雨

TA贡献1853条经验 获得超6个赞

性能完全相同,因为引用是作为指针在内部实现的。因此,你不需要担心这一点。

关于何时使用引用和指针,没有普遍接受的约定。在一些情况下,您必须返回或接受引用(例如,复制构造函数),但除此之外,您可以随意执行。我遇到的一个相当常见的约定是,当参数必须引用现有对象时使用引用,当空值确定时使用指针。

一些编码约定(如谷歌的)规定应该始终使用指针或Const引用,因为引用有一些不明确的语法:它们有引用行为,但有值语法。


查看完整回答
反对 回复 2019-06-21
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

从…C+FAQ Lite -

可以时使用引用,必要时使用指针。

当您不需要“重新处理”时,引用通常比指针更好。这通常意味着引用在类的公共接口中最有用。引用通常出现在对象的皮肤上,指针出现在内部。

上述情况的例外情况是,函数的参数或返回值需要“Sentinel”引用-一个不引用对象的引用。这通常最好是返回/接受一个指针,并赋予空指针这个特殊的意义(引用必须总是别名对象,而不是取消引用的空指针)。

注意:老C行程序员有时不喜欢引用,因为他们提供的引用语义在调用者的代码中不明确。然而,经过一些C+经验之后,人们很快就意识到这是一种信息隐藏形式,它是一种资产,而不是一种负债。例如,程序员应该用问题的语言而不是机器的语言来编写代码。


查看完整回答
反对 回复 2019-06-21
  • 3 回答
  • 0 关注
  • 385 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信