29

这里有两个相关的问题:

A)枚举是如何实现的?例如,如果我有代码:

enum myType
{ 
   TYPE_1,
   TYPE_2
};

实际发生了什么?我知道您可以将 TYPE_1 和 TYPE_2 视为整数,但它们实际上只是整数吗?

B)基于该信息,假设传入的枚举不需要更改,将 myType 作为值或作为 const 引用传递给函数是否更有意义?

例如,哪个是更好的选择:

void myFunction(myType x){ // some stuff }

或者

void myFunction(const myType& x) { // some stuff }
4

5 回答 5

26

速度方面,几乎可以肯定这无关紧要——任何体面的 C++ 编译器都只会传递一个 int。

重要的一点是可读性——这会让你的代码对读者更明显吗?

如果很明显这些枚举真的只是整数,那么我会按值传递它们,就好像它们是整数一样。使用 const ref 可能会导致程序员三思而后行(绝不是一个好主意!)

但是 - 如果您稍后要用一个类替换它们,那么保持 API 相同并强制执行 const-ness 可能是有意义的。

于 2011-07-26T18:18:05.250 回答
13

C++ 标准(第 7.2/5 节)保证枚举的基础类型是一个整数类型,可以表示枚举中定义的所有枚举值。所以按值传递它,不要让你的代码变得更复杂。

于 2011-07-26T18:25:31.300 回答
3

我知道您可以将 TYPE_1 和 TYPE_2 视为整数,但它们实际上只是整数吗?

是的。它们是整数类型,并且很可能它们的类型只是int因为那是最自然的类型。所以你可以按值传递;通过引用传递不会给你任何显着的优势。

顺便说一句,供您参考,第 7.2/5 节说,

枚举的底层类型是一个整数类型,可以表示枚举中定义的所有枚举值。使用哪种整数类型作为枚举的基础类型由实现 定义,除非基础类型不得大于 int,除非枚举数的值不能适合 int 或 unsigned int。如果 enumerator-list 为空,则基础类型就好像该枚举具有一个值为 0 的单个枚举器。应用于枚举类型、枚举类型的对象或枚举器的 sizeof() 的值是sizeof() 应用于基础类型。

于 2011-07-26T18:25:05.853 回答
2

按值传递内置简单类型(char、short、int、enum、float、指针)

枚举被实现为整数,您甚至可以为它们显式指定值。

于 2011-07-26T18:17:38.540 回答
0
typedef enum
{
    FIRST_THING,
    SECOND_THING
} myType;

然后像 int 一样使用它。按值传递。

于 2011-07-26T18:19:01.410 回答