首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在C++类中,枚举的变量名必须在枚举值之后?

在C++类中,枚举的变量名必须在枚举值之后的原因是为了确保枚举类型的变量在定义时具有确定的值。

枚举类型是一种特殊的数据类型,它允许我们定义一组具有相同类型的常量。在C++中,枚举类型的定义通常包含枚举名称和一组枚举值。枚举值是枚举类型的具体常量,它们可以是整数、字符或其他整数类型。

当我们在类中定义枚举类型时,我们希望这个枚举类型的变量在创建时就具有确定的值。如果我们将变量名放在枚举值之前,那么在定义变量时,编译器无法确定变量的值,因为它还没有遇到枚举值的定义。这将导致编译错误。

因此,为了确保枚举类型的变量在定义时具有确定的值,C++规定了枚举的变量名必须在枚举值之后。

举例来说,假设我们有一个表示颜色的枚举类型:

代码语言:txt
复制
enum Color {
    RED,
    GREEN,
    BLUE
};

在这个例子中,枚举类型Color的变量可以在定义时具有确定的值,例如:

代码语言:txt
复制
Color myColor = RED;

如果我们将变量名放在枚举值之前,例如:

代码语言:txt
复制
enum Color {
    myColor,
    RED,
    GREEN,
    BLUE
};

那么在定义变量时,编译器无法确定myColor的值,因为它还没有遇到RED的定义,这将导致编译错误。

总结起来,C++类中枚举的变量名必须在枚举值之后,是为了确保枚举类型的变量在定义时具有确定的值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C#基础知识大总结(C语言基础上)

1, //默认第一个是0 下面依次累加     自定义枚举项名字2,     自定义枚举项名字3, } 如果自己给其中一个枚举项赋了,那么后面的项都会在此基础上递增,除非人为再次改变 b.声明 一般...namespace语句块当中声明  可以class语句块 可以struct语句块 不能在函数声明!!!...公式:自定义枚举类型 变量名 = 默认; (自定义枚举类型.枚举项) enum E_PlayerType {     Main, //默认第一个是0 下面依次累加     Other, } E_PlayerType...a.交错数组(几乎不用 有兴趣可了解) 二、与引用 引用类型有:string、数组、 类型:除引用类型之外如char、int、short、bool和结构体等一系列 1.特殊引用类型string 每次赋值...1.访问修饰符 修饰结构体变量和方法 能否被外部使用 public是公共  private是私有的(默认都是私有的) 2.结构体构造函数 没有返回 函数名与结构体名相同 必须有参数 声明了构造函数就必须在其中对所有变量数据初始化

18220

C编程规范整理

这一点并不是必须遵循规则,输入/输出两用参数(通常是/结构体变量)混在其中,会使得规则难以遵循。 包含文件名称及次序:C库、C++库、其他库.h、项目内.h。 编写短小函数。...变量名一律小写,单词间以下划线相连,成员变量以下划线结尾,如my_exciting_local_variab1e、my_exciting_meber_variab1e_。 全局变量。...其他短小内联函数名也可以使用小写字母,例如,循环中调用这样函数甚至都不需要缓存其,小写命名就可以接受。 枚举命名。...枚举应全部大写,单词间以下划线相连:MY_EXCITING_ENUM_VALUE。枚举名称属于类型,因此大小写混合:Ur1Tab1eErrors。 宏命名。...避免注释中使用缩写,除非是业界通用或子系统内标准化缩写。 注释应考虑程序易读及外观排版因紊,使用语言若是、英兼有的,建议多使用中文,除非能用非常流利准确英文表达。

81020

夯实Java基础系列12:深入理解Java反射机制

像Java1.5引入很多特性,为了向后兼容,编译器会帮我们写源代码做很多事情,比如泛型为什么会擦除类型,为什么会生成桥接方法,foreach迭代,自动装箱/拆箱等,这有个术语叫“语法糖”,而编译器特殊处理叫...那么像枚举也是JDK1.5才引入,又是怎么实现呢? Java1.5添加了java.lang.Enum抽象,它是所有枚举类型基。提供了一些基础属性和基础方法。...重要概念,我在这里赘述一遍,帮助老铁们快速掌握这块知识,首先记住,枚举枚举可以没有参数,也可以有多个参数,每一个枚举都是一个实例; 并且还有一点很重要,就是如果枚举有 n 个参数,那么构造函数参数值肯定有...之后通过实例就可以随意获取实例任意参数值了。...如果想让枚举更加好用,就可以模仿我实战三写法那样,通过某一个参数值,比如 key 参数值,就能获取到其对应枚举,然后想要什么,就 get 什么就好了。

1.6K00

Gopro Ardunio控制库.2

以表示该变量是某个属性。...看枚举 ---- 枚举变量未分配初始。默认情况下,第一个枚举成员默认为“0”,后续枚举成员dao为前一个枚举成员(按文本顺序)加一。...但是,其须在基础类型可以表示范围内;枚举类型,通过预定义列出所有标识符来定义有序集,其顺序与枚举类型描述标识符顺序一致。枚举类型形式:(标识符1,...,标识符n)。...枚举元素只能是标识符,而不是数字常量或字符常量。枚举C/C++/c#,是一个被命名整型常数集合, 枚举日常生活很常见。...枚举有点迷, hero4->4就是这样了..... ? 看注意事项 ? 不知道你们有没有看懂我为什么还在这里研究,就是我觉得枚举不对, 看下面的这些东西应该是枚举值得基础上再加1????为什么

51610

protobuf 序列化和反序列化

将xxx.proto文件生成一个c++ 会生成一个头文件/ 源文件 操作命令-> window终端: protoc xxx.proto --cpp_out=./ 使用这两个文件...成员变量 数据类型 变量名 = 变量编号; // 编号从1开始, 不能重复 } // .proto文件 生成 c++ 命令 protoc proto文件名 --cpp_out=生成目录 具体转换类型规则如下所示...以下是一个示例,展示了如何使用protobuf枚举类型: // 定义枚举 enum PhoneType { MOBILE = 0;// protbuf第一个枚举必须为0 HOME =...这样,我们就可以轻松地区分不同类型电话号码,并按照类型进行处理。 protobuf枚举类型对应一个整数,可以使用=操作符为其指定具体。...C++ API来读写消息 读: 变量名() 写: set_变量名(arg1, arg2, ...)

33510

夯实Java基础系列14:深入理解Java枚举

像Java1.5引入很多特性,为了向后兼容,编译器会帮我们写源代码做很多事情,比如泛型为什么会擦除类型,为什么会生成桥接方法,foreach迭代,自动装箱/拆箱等,这有个术语叫“语法糖”,而编译器特殊处理叫...那么像枚举也是JDK1.5才引入,又是怎么实现呢? Java1.5添加了java.lang.Enum抽象,它是所有枚举类型基。提供了一些基础属性和基础方法。...重要概念,我在这里赘述一遍,帮助老铁们快速掌握这块知识,首先记住,枚举枚举可以没有参数,也可以有多个参数,每一个枚举都是一个实例; 并且还有一点很重要,就是如果枚举有 n 个参数,那么构造函数参数值肯定有...之后通过实例就可以随意获取实例任意参数值了。...如果想让枚举更加好用,就可以模仿我实战三写法那样,通过某一个参数值,比如 key 参数值,就能获取到其对应枚举,然后想要什么,就 get 什么就好了。

50520

夯实Java基础系列14:深入理解Java枚举

像Java1.5引入很多特性,为了向后兼容,编译器会帮我们写源代码做很多事情,比如泛型为什么会擦除类型,为什么会生成桥接方法,foreach迭代,自动装箱/拆箱等,这有个术语叫“语法糖”,而编译器特殊处理叫...那么像枚举也是JDK1.5才引入,又是怎么实现呢? Java1.5添加了java.lang.Enum抽象,它是所有枚举类型基。提供了一些基础属性和基础方法。...重要概念,我在这里赘述一遍,帮助老铁们快速掌握这块知识,首先记住,枚举枚举可以没有参数,也可以有多个参数,每一个枚举都是一个实例; 并且还有一点很重要,就是如果枚举有 n 个参数,那么构造函数参数值肯定有...之后通过实例就可以随意获取实例任意参数值了。...如果想让枚举更加好用,就可以模仿我实战三写法那样,通过某一个参数值,比如 key 参数值,就能获取到其对应枚举,然后想要什么,就 get 什么就好了。

36600

Java基础:Java基本概念

1、声明变量 Java ,每个变量都有一个类型(type)。声明变量时,变量类型位于变量名之前。...3、常量 Java ,利用关键字 final 指示常量,关键字 final 表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。习惯上,常量名使用全大写。... Java ,经常希望某个常量可以一个多个方法中使用,通常将这些常量称为常量。可以使用关键字 static final 设置一个常量。...Size.MEDIUM; Size 类型变量只能存储这个类型声明给定某个枚举,或者 null ,null 表示这个变量没有设置任何。...注意事项:①多个方法必须在同一个;②多个方法有同样方法名;③多个方法参数不相同,即数量不相同或者类型不相同;④重载仅仅针对同一个名称与参数进行识别,与返回无关。

32960

预处理--》编译--》运行区别

枚举类型成员是常量,它们由编译器自动分配,例如定义了上面的枚举类型之后,RECTANGULAR就表示常量0,POLAR 表示常量1。...枚举常量也是一种整型,其在编译时确定,因此也可以出现在常量表达式,可以用于初始化全局变量或者作为case 分支判断条件。...有一点需要注意,虽然结构体成员名和变量名不在同一命名空间中,但枚举成员名却和变量名同一命名空间中,所以会出现命名冲突。那什么是命名空间呢?...,可以看到打印完之后里面的rectanger变量就会被释放,但polar变量得等整个函数调用完毕才会释放,因为这里使用枚举类型成员。...须在程序运行时调用 acos函数才能得到,所以不能用来初始化全局变量。

86570

Java程序设计(Java9版):第4章 简单复合类型

第4章 简单复合类型 4.1 数组 C语言中,数据类型除了基本数据类型之外,还存在着大量复合数据类型。数组就是一最简单且非常重要复合数据类型,数组是具有相同类型变量顺序存储集合。...第一步先通过“数据类型 变量名”声明变量,只栈内存变量名分配一个很小空间,但是并没有开辟具体数据空间;比如某一复合数据类型声明了变量a,如图2.44所示。...第二步,通过new关键字堆内存开辟一个复合“数据类型”大小存储空间,用于存储具体是数据实体;然后将该存储空间地址赋值到变量名栈存储空间内。...数组是引用类型,所以数组名存储栈内存,而数组元素存储堆内存。 4.1.2 数组操作 (1)数组初始化 数组初始化就是为数组元素分配内存空间,并为每个数组元素指定初始。...; 可以将一个枚举类型定义Java源文件,编译后得到字节码文件。

1.1K100

C++ Primer Plus 第四章 复合类型 学习笔记

数组声明三个特点: 存储每个元素类型 数组名 数组元素数 C++可以通过修改简单变量声明,添加括号(其中包含元素数目)来完成数组声明。...基于String方法 存储连续字节一系列字符意味着可以将字符串存储char数组。其中每个字符都位于自己数组元素。...3. string string位于名称空间std,所以需要提供using指令或者是直接使用std::string进行引用。 要使用string,必须在程序包含头文件string。...enum {zero,null = 0,numero_one,one = 1}; 6.2 枚举取值范围 每个枚举都有取值范围上限,通过强制类型转换,可以将取值范围任何整数值赋给枚举常量,即使这个不是枚举...*/ C++,int*是一种复合类型,是指向int指针。

1.8K00

C++ primer》--第1,2章小结

5、C++,把负值赋给unsigned对象是合法,其结果是该负数对该类型取值个数求模后,如果把-1赋给8位unsigned char 那么结果就是255。...C++每一个变量都有特定类型,该类型决定了变量内存大小和布局、能够存储与该内存取值范围以及可运用在该变量上操作集。     2.C++关键字 ?...引用是一种复合类型,变量名前添加"&"符号来定义。复合类型指其他类型定义类型。...定义多个引用:可以一个类型定义行定义多个引用。必须在每个引用标识符前添加"&"符号。 const引用:指向const对象引用。可以读取但不能修改。...:头文件可以定义在编译时就已知const对象和inline函数) 一些const对象定义头文件 16、预处理器简单介绍  1.头文件经常需要其他头文件    2.避免多重包含:预处理器变量名字程序必须是唯一

864100

Java 枚举使用

日常写项目时,很多数据字典常量都需要定义和使用,同时 Java 面试枚举也是一个绕不开的话题,这篇文章就来详细介绍一下枚举定义以及使用。 01  【什么是枚举?】...枚举类型 C# 或 C++ 、 java 、 VB 等一些编程语言中是一种基本数据类型而不是构造数据类型。 而在C语言中则是一种构造数据类型。...枚举定义就是指将变量一一列出来,变量只限于列举出来范围内,使用枚举可以很方便地定义数据常量、以及我们使用。 02  【为什么需要枚举?】...我们调试时候,最初将“男”输出,结果为1。因此,我们必须在前面寻找0含义。 尤其是当我们查看其他人代码时会看不懂。而定义枚举里面进行详细说明的话就能清楚得知含义。 (2)代码更优雅。...大一点项目中,可以使用数百个静态常量。如果它们都写在一个文件里面的话,很容易造成命名混乱,程序也很难读取。 (3)可以帮助我们定义所需类型。 枚举易于记忆和使用,相当于一个接口。

1.6K20

Python编程思想(31):枚举类型深度详解

很多场景下,一个变量是固定且有限,例如,季节只有4个(春、夏、秋、冬),性别只有2个(男和女)。这种有限且固定数据类型Python称为枚举类型。 1....枚举类型基础 Python中有两种方式来定义枚举类型: 直接使用Enum列出多个枚举来创建枚举 通过继承Enum基来派生枚举 如下面的代码演示了直接使用Enum列出多个枚举来创建枚举类型。...定义了上面的 Season枚举之后,程序可直接通过枚举进行访问,这些枚举都是该枚举成员,每个成员都有name和value两个属性,其中name属性为该枚举变量名,value代表该枚举序号...虽然此时 Orientation枚举类型 value是str类型,但该枚举类同样可通过 value来访问特定枚举,如上面程序 Orientation(’北'),这是完全允许。...为枚举定义构造方法之后定义枚举实例时必须为构造方法参数设置,代码如下: 示例代码:enum_constructor,py import enum class Sex(enum.Enum):

2.8K10

java枚举解读

为什么需要枚举 对象只有有限个,确定。举例如下:  星期:Monday(星期一)、.........  使用说明 使用 enum 定义枚举默认继承了 java.lang.Enum,因此不能再继承其他枚举构造器只能使用 private 权限修饰符 枚举所有实例必须在枚举显式列出...列出实例系统会自动添加 public static final 修饰 必须在枚举第一行声明枚举对象 JDK 1.5 可以 switch 表达式中使用Enum定义枚举对象作为表达式...,那么将会抛出异常No enum constant 实现接口枚举 和普通 Java 一样,枚举可以实现一个或多个接口 若每个枚举调用实现接口方法呈现相同行为方式,则只要统一实现该方法即可...若需要每个枚举调用实现接口方法呈现出不同行为方式,则可以让每个枚举分别来实现该方法

17940

零基础学Java(2)数据类型与变量

整型和布尔之间不能进行相互转换。 注释 C++,数值甚至指针可以代替boolean0相当于布尔false,非0相当于布尔true。Java则不是这样。...变量名大小写敏感 +这样符号不能出现在变量名,空格也不行 不能使用Java保留字作为变量名 变量初始化 声明一个变量之后,必须用赋值语句对变量进行显式初始化,千万不要使用未初始化变量。...我们可以看到当我们要修改常量时,就会报错,原因如下: Java,经常希望某个常量可以一个多个方法中使用,通常将这些常量称为常量。...因此,同一个其他方法也可以使用这个常量。而且,如果一个常量被声明为public,那么其他方法也可以使用这个常量。...方法依然可以使用变量,因为都是FirstSample这个方法 System.out.println(CM_PER_INCH); } } 枚举类型 有时候,变量取值只一个有限集合内

30420

C# 学习笔记(2)—— 语言基础

举个实际场景就是你关键字和实体属性冲突情况下,我们会在实体字段前加上 @ 前缀 数据类型 通用类型系统(CTS)将类型分为两大类:类型和引用类型 类型包含:数值类型、布尔类型、枚举类型、结构体类型...这就是 string 不可变性,所以,如果你一个字符串频繁进行修改,会增加内存开销 枚举类型 枚举类型属于类型,它用于声明了一组命名了常数 enum Gender { Female,...Male } 很少有人知道我们还可以给枚举添加继承 enum Gender : byte { Female, Male, } 结构体 C# 结构体是一种类型,通常适用于表示诸如 Point...因为有了变量,我们不需要再去记忆复杂内存地址,而是转为通过变量名来完成内存数据存取操作。...与变量不同,常量不能在赋值之后发生变化,而其对应内存不能被改变 变量使用 语法很简单:数据类型 变量名 如果要同时声明多个同类型变量,可以用这种语法: int a, b, c; 如果在声明之后

16910

一篇文章带你过一遍 TypeScript

1.2 空、任意枚举、Never void/any/enum/never void 指空,若用于变量,则该变量只能赋值为 null/undefined;若用于函数,则该函数返回为 空/null...any 指任意。TypeScript 变量赋值后类型是无法改变,但 any 类型变量可以改变为任意。...泛型通过函数、接口、变量名后使用 定义。...TypeScript readonly 修饰符修饰属性,代表属性只读,即初始化之后不可修改。 3.2 抽象 抽象指对中部分方法进行抽象,作为其他继承,不能直接实例化。...abstract class Animal { // 必须在派生实现 abstract makeSound(): void; // 无须在派生实现 move(): void { console.log

1.6K20
领券