将枚举传递给函数 - 按值或按引用?

时间:2016-01-22 09:26:44

标签: c++

如果我错了,请更正我,但是你通过值传递整数和其他基本数据类型的原因是因为它们占用的内存太小,所以制作该数据类型的指针变量是浪费的(这将是可能至少与数据类型相同)。

这就是为什么我总是将int和其他基本类型按值传递给函数,而其他(更大)数据类型则由const引用或const指针传递。我抓住了这个吗?

现在我已经看到很多API将enum类型作为const引用传递,如下所示:

enum FileOptions { ReadOnly, ReadWrite, WriteOnly };
void processFile(const FileOptions &options);

据我所知,枚举通常由编译器解释为普通整数,为什么它们通过引用传递?是否从开发人员那里抽象出数据类型,所以他不会将FileOptions视为整数? (虽然是)。

4 个答案:

答案 0 :(得分:1)

我能看到的唯一优势是,如果你以后决定创建一个具有扩展功能的类,你可以在不改变代码的情况下有效地传递它。

如果它是基本类型的const引用,那么任何体面的优化器都不关心引用,并且在两种情况下都创建相同的代码。

另一个结果可能是,如果引用是某个其他变量并且它被另一个线程更改,它甚至可以在函数过程中更改它的值(即使它表示它是const),我认为是不是真的很可取。在这种情况下,它将在很大程度上取决于优化在该方法的给定分支中使用的值。

答案 1 :(得分:0)

你是对的,enum基本上是一个' const int'。

第二个猜测为什么一些开发人员选择某种风格是徒劳的。

除非你在非常接近的循环中调用函数,否则无论如何都不重要。

答案 2 :(得分:0)

在现代C ++中,还有枚举类,它是强类型枚举。 我认为const引用仅用于相似性,并且将来很容易修改。

例如,你有一个包含很多方法的类,这个方法中的所有参数通常都是复杂的对象,当然也是通过const引用传递的。因此,您以相同的方式声明枚举参数。你肯定会知道它不应该被改变等等

稍后您可能希望在更复杂的对象中转换枚举,您根本不需要更新函数声明。它已经适合这种重构

答案 3 :(得分:-1)

有一个很大的区别:如果您将选项作为值传递,那么它将成为函数中的局部变量,只有您的函数可以更改它。如果你将选项作为const&传递,那么在某个地方有一个变量,它可能是一个静态变量或全局变量,如果你的函数修改了FileOptions类型的任何其他变量,那么它可能是一个传递给你的变量。 const&,因此选项的值可能会改变。

如果你的函数调用另一个函数,那么该函数可能会更改选项后面的变量。所以作为一个开发人员,在任何函数调用之后你可能会怀疑选项可能已经改变了(尽管如果发生这种情况,那将是可想象的最糟糕的编程风格),而且编译器必须假设它已经改变,除非它可以另有证明。

修改const&以这种方式会很糟糕,所以我们可以安全地假设,除非来电者绝对讨厌你一个const&不会改变。你使用const&当你真的想要传递一个值,但通过引用传递它似乎更有效。对于一个毫无意义的int,对于一个包含10兆字节int的数组来说,它并不是毫无意义的。

const& amp;的另一个用途而不是值是对于无法轻易复制的对象。例如,无法轻易复制互斥锁。或者,根据定义,提供对文件的独占访问权的对象不能以有意义的方式复制。