这里有两个相关的问题:
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 }
答案 0 :(得分:17)
速度方面几乎肯定没关系 - 任何体面的C ++编译器都只会传递一个int。
重点是可读性 - 这将使您的代码对读者更明显?
如果很明显这些枚举真的只是整数,那么我会按价值传递它们,就好像它们是整数一样。使用const ref可能会导致程序员三思而行(绝不是个好主意!)
然而 - 如果你以后要用类替换它们,那么保持API相同并强制执行const-ness可能是有意义的。
答案 1 :(得分:8)
C ++标准(第7.2 / 5节)保证枚举的基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值。因此,按值传递它,不要让你的代码更复杂。
答案 2 :(得分:1)
我知道您可以将TYPE_1和TYPE_2视为整数,但它们实际上只是整数?
是。它们是整数类型,很可能它们的类型只是int
,因为这是最自然的类型。所以你可以通过价值;通过引用传递不会给你任何显着的优势。
顺便提一下,§7.2/ 5节说明了
供你参考枚举的基础类型是可以的整数类型 表示枚举中定义的所有枚举器值。它是 实现定义的使用哪个整数类型作为底层 枚举的类型,但基础类型不应该是 大于int,除非枚举器的值不适合int 或unsigned int。如果枚举器列表为空,则为基础类型 好像枚举有一个值为0的枚举器 sizeof()的值应用于枚举类型,对象的 枚举类型或枚举器是应用的sizeof()的值 基础类型。
答案 3 :(得分:0)
按值传递内置的简单类型(char,short,int,enum,float,pointers)
枚举实现为整数,您甚至可以明确指定它们的值。
答案 4 :(得分:0)
typedef enum
{
FIRST_THING,
SECOND_THING
} myType;
然后像int一样使用它。按值传递。