指针与参考

给一个函数使用原始变量时,更好的做法是:

unsigned long x = 4;

void func1(unsigned long& val) {
     val = 5;            
}
func1(x);

要么:

void func2(unsigned long* val) {
     *val = 5;
}
func2(&x);

IOW:有什么理由选择一个吗?


我的经验法则是:

如果你想对它们进行指针运算,就使用指针(例如,增加指针地址以逐步通过一个数组),或者你必须传递一个NULL指针。

否则请使用参考。


我真的认为您将从建立以下函数调用编码准则中获益:

  • 和所有其他地方一样,永远是const正确的。

  • 注意:这意味着,除了别的以外,只有超值(参见第3项)和值传递的值(参见第4项)可能缺少const说明符。
  • 如果值0 / NULL是当前上下文中的有效输入,则只能通过指针传递值。

  • 理由1:作为一个调用者 ,你会发现无论你传入什么都必须处于可用状态。

  • 理由2:如所称的那样 ,您知道无论进入什么都处于可用状态。 因此,不需要对该值进行NULL检查或错误处理。

  • 理由3:理论1和理论2将被编译器强制执行。 如果可以的话,一定要在编译时发现错误。

  • 如果函数参数是一个out-value,那么通过引用传递它。

  • 理由:我们不想中断项目2 ...
  • 只有当该值是POD(普通的旧数据结构)或足够小(以记忆方式)或以其他足够便宜(按时间方式)复制的方式时,才选择“通过值传递”而不是“通过值参考”。

  • 理由:避免不必要的副本。
  • 注意:小到足够便宜并不是绝对可测量的。

  • 这最终会成为主观的。 迄今为止的讨论是有用的,但我认为这没有一个正确或决定性的答案。 很多将取决于时尚的风格指引和您的需求。

    尽管使用指针有一些不同的功能(无论是否为NULL),但输出参数的最大实际区别纯粹是语法。 例如,Google的C ++风格指南(https://google.github.io/styleguide/cppguide.html#Reference_Arguments)只规定输出参数的指针,并且只允许为const的引用。 理由之一是可读性:具有价值语法的东西不应具有指针语义含义。 我并不是在暗示这一定是对是错,但我认为这里的一点是,这是一个风格问题,而不是正确性问题。

    链接地址: http://www.djcxy.com/p/20777.html

    上一篇: Pointer vs. Reference

    下一篇: const references prolong the lives of temporaries?