2

可能重复:
在 C++ 中通过值传递还是通过常量引用传递更好?
在 C++ 中何时通过引用传递以及何时通过指针传递?

我对 c 和 c++ 还很陌生,关于将参数传递给函数,我有以下问题,我认为最好在这里提问,直接从大师那里获得知识的来源。

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

提前致谢。

4

6 回答 6

3

首选通过引用传递,通常是以下一项或多项:

  1. 如果很大的话。(如果是的话const,一定要这样做,但无论如何都要经常这样做,具体取决于此列表的其余部分)
  2. 如果要编辑它并使更改全局可见。
  3. 如果您希望虚函数具有多态性。
  4. 如果您不知道它将是什么类型,请在模板代码中。

按值传递:

  1. 如果它是一个普通的内置类型(例如 int)
  2. 如果您不希望更改更改原始对象。
  3. 如果您希望能够传递临时变量而不必将其设为 const。
于 2011-05-14T15:02:02.537 回答
1

如果参数大于 register 并且您没有修改它,则应将其作为 const 引用传递。当然,也有一些例外情况,您稍后会创建一个副本左右,但总的来说,这条规则是正确的。

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

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

于 2011-05-14T15:02:22.313 回答
0

按价值传递,除非你有理由不这样做。不这样做的理由:

  1. 您希望函数以某种方式更改对象。通过引用或指针传递。
  2. 对象是“大”的。“大”的精确定义将取决于您的计算机、您的平台、复制对象的后果等。您必须根据具体情况进行评估。通过 const 引用传递。
  3. 制作对象的副本会做一些“坏事”。例如,如果通过复制文件指针对象会创建另一个文件,或者通过复制同步对象会创建死锁。通过 const 引用传递。
  4. 您需要传入对象的多态行为。通过引用或指针传递。按值传递将对对象进行切片

请注意,对于上面的#2,即使对象很大,您仍可能希望按值传递。按值传递更简单,因此更易于维护,除非您有理由相信按值传递会在代码中产生实际问题,否则按 const 引用传递可能是过早的微优化。例如,如果您的函数采用一个 64 字节(甚至 64k 字节)的参数,但该函数每天只调用一次,则实际上没有理由通过 const 引用传递。它几乎不会为您节省任何费用。首先在发布模式下分析您的代码,然后进行优化。

于 2011-05-14T15:04:06.590 回答
0

默认情况下,通过 const 引用传递,除了:

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

于 2011-05-14T15:05:46.820 回答
0

通常,当您需要更改参数并且不希望调用者必须进行复制时,您应该使用按值传递。您应该在其他任何地方都使用对 const 的引用传递。

然而,这实际上归结为“C++ 作为语言的联合”位——例如,如果您正在编写 STL 算法,您需要使用按值传递,因为迭代器和仿函数近似指针和函数指针。

于 2011-05-14T15:06:52.603 回答
0

这主要取决于您的需求。如果您想看到对传递的变量所做的更改反映在当前函数中,您肯定会通过引用传递,但如果您严格要求对传递的变量进行任何更改变量未反映在您当前的函数中,请选择“按值传递”。

谢谢, 玛维亚

于 2011-05-14T15:09:18.237 回答