【问题标题】:Pass object or pointer as value when not changing that object in function不更改函数中的对象时将对象或指针作为值传递
【发布时间】:2013-11-07 08:18:22
【问题描述】:

在 c++ 中,有多种方法可以将对象作为参数传递给函数。我一直在阅读有关按值传递和引用传递的内容。

这些链接非常有用:

http://www.yoda.arachsys.com/java/passing.html http://www.yoda.arachsys.com/csharp/parameters.html

就我现在想知道的 c++ 而言,我也看到了这篇文章:

http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

这些涉及按值传递和引用之间的区别。最后一篇文章也描述了这个问题的一些利弊。我想知道在函数中未修改对象的情况下将参数作为值传递的利弊。

int f(sockaddr_in s) {
// Don't change anything about s
}

int f(sockaddr_in *s) {
// Don't change anything about s
}

两者都允许我访问它拥有的变量。但我想知道我应该使用哪一个,以及为什么。

【问题讨论】:

  • 在第二个例子中你的意思是int f(sockaddr_in &s) {通过引用而不是*s?,否则你传递的是一个指针,它不完全一样。
  • 这里没有传递引用。除此之外,通常会传递一个指针(或引用),以避免复制整个对象。
  • @stijn 这是一个非常有用的链接。可惜我之前没发现。

标签: c++ pointers parameter-passing pass-by-value


【解决方案1】:

在第一个示例中,f() 获得了原始对象的副本,因此不可能更改后者。但是,调用了复制构造函数,这可能非常昂贵,因此不建议作为通用方法。

在第二个示例中,f() 要么获得一个指针,要么(对于f(obj&x))获得一个对原始对象的引用,并允许对其进行修改。如果函数只接受const 指针或引用,如f(const object&x),则不能合法地更改对象。在这里,没有复制。因此,通过 const 引用传递是不应该修改的参数的标准方法。

【讨论】:

    【解决方案2】:

    您忽略了 c++ 的一个基本内容:const 正确性:声明 'int f(sockaddr_in *s)' 违反了这一点。 'int f(sockaddr_in s)' 不是并且可能是合理的(sockaddr_in 很小或被复制)。因此,'int f(const sockaddr_in& s)' 和 'int f(sockaddr_in s)' 可能都是不错的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-17
      • 2012-10-06
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      相关资源
      最近更新 更多