何时通过引用传递,何时通过c / c ++中的值传递

时间:2011-05-14 15:00:17

标签: c++ parameters pass-by-reference pass-by-value

  

可能重复:
  Is it better in C++ to pass by value or pass by constant reference?
  When to pass by reference and when to pass by pointer in C++?

我对c和c ++相当新,我对将参数传递给函数有以下问题,并且最好在这里问一下并直接从大师那里获取知识的来源。

我应该何时按值传递参数,何时通过引用传递?现实世界中最常用的方法是什么?

提前致谢。

6 个答案:

答案 0 :(得分:3)

首选参考文献,通常是以下一项或多项:

  1. 如果它很大。 (如果它是const肯定会这样做,不管怎么说都要这样做,这取决于这个列表的其余部分)
  2. 如果您想对其进行编辑并使全局变更可见。
  3. 如果您希望虚函数具有多态性。
  4. 在模板代码中,如果你不知道它将是什么类型。
  5. 按值传递:

    1. 如果它是一个普通的内置类型(例如int)
    2. 如果您不希望更改原始对象。
    3. 如果你希望能够通过临时工而不必使它成为常数。

答案 1 :(得分:1)

如果参数大于寄存器并且您没有修改它,则应将其作为const引用传递。当然,在某些特殊情况下,您稍后会创建一个副本,但通常这个规则都适用。

对于较小的类型,它应该无关紧要(即const int&或int)应该给出相同的结果。为了安全起见,无论如何都要按值传递它们。对于通用代码,您可以使用Boost Call Traits库自动决定是使用按引用还是按值。

如果要修改对象,将其作为引用传入允许您就地修改它,这通常比返回一个新对象并覆盖原始对象更快。

答案 2 :(得分:0)

除非您有理由不通过,否则按值传递。不理由的原因:

  1. 您希望函数以某种方式更改对象。通过引用或指针传递。
  2. 对象是“大”。 “大”的精确定义将取决于您的计算机,您的平台,制作对象副本的后果等。您必须根据具体情况进行评估。通过const引用。
  3. 制作一个对象的副本会做一些“坏事”。例如,如果通过复制文件指针对象而创建另一个文件,或者通过复制同步对象,则会创建死锁。通过const引用。
  4. 您需要对传入的对象进行多态行为。通过引用或指针传递。按值传递slice the object
  5. 请注意,使用上面的#2,即使对象很大,您仍可能希望按值传递。通过值传递更简单,因此更容易维护,除非您有理由相信通过值传递会在代码中产生实际问题,否则传递const引用可能是过早的微观优化。例如,如果您的函数采用64字节(甚至64k字节)的参数但该函数每天只调用一次,那么实际上没有理由通过const引用。它几乎可以为您节省一些首先在发布模式下配置代码,然后进行优化。

答案 3 :(得分:0)

默认情况下,传递const引用,但:

1)如果你想要一个输入/输出或输出参数 - 一个被功能改变的参数。在这种情况下,请使用非const引用。 2)如果传递整数,浮点数或指针 - 按值传递。

答案 4 :(得分:0)

通常,您需要在需要更改参数时使用pass by value,并且不希望调用者必须进行复制。你应该在其他任何地方使用pass to reference to const。

然而,这实际上归结为“C ++作为语言联盟”一位 - 例如,如果您正在编写STL算法,则需要使用pass by value,因为迭代器和函子接近指针和函数指针。

答案 5 :(得分:0)

这主要取决于您的需求。如果您希望看到对当前函数中反映的传递变量所做的更改,那么您肯定会按引用传递,但如果您严格要求进行任何更改传递的变量没有反映在你当前的函数中去'传递值'。

谢谢, Mawia