【问题标题】:Object by reference and without reference引用对象和不引用对象
【发布时间】:2014-03-04 03:36:57
【问题描述】:

我想问一个让我困惑的简单问题。 例如,如果我在参数中写,则没有参考 &。但在第二种情况下,我将 & 与 rectangleType& 一起使用,我很困惑为什么我们使用这个 & 什么时候我们可以在没有这个 & 的情况下使用它。这在哪里是必要的以及我们为什么使用它。我的问题与复制构造函数无关。

 rectangleType rectangleType::operator+
(const rectangleType rectangle)

案例 2:

rectangleType rectangleType::operator+
(const rectangleType& rectangle)

【问题讨论】:

标签: c++


【解决方案1】:

当您通过值传递像rectangleType(或任何其他类型)这样的对象时,您正在制作该对象的副本。这意味着:

  • 调用者看不到函数对对象所做的任何更改,因为更改是针对副本而不是原始对象进行的。
  • 复制对象的行为会产生性能成本。
  • 对于某些类型甚至可能无法复制对象。

所以,在任何时候都通过引用传递:

  • 您希望函数能够修改原始对象。
  • 您希望代码运行得更快,无需复制。
  • 您传递的对象没有公共复制构造函数。

当您不需要需要函数来修改原始对象时,通过 const 引用。

对于用户定义的类型,这基本上归结为“尽可能通过引用传递”。

【讨论】:

  • OP 询问 const 引用
  • @Paranaix 不,他没有; const 仅出现在他的示例代码中,从他的问题来看,我认为他的困惑比具体针对 const 更为普遍。尽管如此,我在答案中添加了关于const 的注释。
【解决方案2】:

如果答案是关于它,你怎么能说你的问题不是关于复制构造的?

  1. 使用 const 引用不会进行复制,这对于非常大的对象至关重要
  2. 有些类明确不提供复制构造函数,这样您仍然可以传递它们。

因此得出结论:你得到好处而没有坏处。

【讨论】:

    【解决方案3】:

    在第一种方法中,它将接收一个(完整的)rectangleType 实例,该实例将使用 复制构造函数 创建,只是作为参数传递。

    在第二种方法中,它将接收到一个已经存在的实例的引用;不会复制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多