Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 枚举在C和C++;_C++_C - Fatal编程技术网

C++ 枚举在C和C++;

C++ 枚举在C和C++;,c++,c,C++,C,枚举是常量整数值的列表。它可以用来代替使用#define定义常量值。但除此之外,我还没有发现枚举在C和CPP中有任何实质性的用途。有人能告诉我枚举的确切用途吗 最初我认为,如果我们创建一个枚举变量并分配一个不在枚举值中的值,编译器将发出呼喊。但事实并非如此。我们可以给enum变量赋值。我想不出enum有什么实质性的用途。enum在编程中非常有用,因为它们使代码更具可读性和一致性 例如:假设我们有以下switch语句: switch(fruit) { case 1: //

枚举是常量整数值的列表。它可以用来代替使用#define定义常量值。但除此之外,我还没有发现枚举在C和CPP中有任何实质性的用途。有人能告诉我枚举的确切用途吗


最初我认为,如果我们创建一个枚举变量并分配一个不在枚举值中的值,编译器将发出呼喊。但事实并非如此。我们可以给enum变量赋值。我想不出enum有什么实质性的用途。

enum在编程中非常有用,因为它们使代码更具可读性和一致性

例如:假设我们有以下switch语句:

switch(fruit)
{
    case 1:
        // code goes here
        break;
    case 2:
        // code goes here
        break;
    case 3:
        // code goes here
        break;
    default:
        // code goes here
        break;
}
如果您定义了一个包含您所拥有的结果的枚举结果,然后按照以下方式使用它,则会更加清楚:

switch(fruit)
{
    case fruits::apple:
        // code goes here
        break;
    case fruits::orange:
        // code goes here
        break;
    case fruits::banana:
        // code goes here
        break;
    default:
        // code goes here
        break;
}
其中
是一个枚举

enum fruits { apple, orange, banana };
现在比较第一个代码段和第二个代码段。第二个更具可读性,除此之外,你不必记住1代表苹果,2代表香蕉等等

与宏相比的优势

  • 调试器可以打印值的名称
  • 您的常量将被限定范围(如果您愿意,也可以将它们放在C++中的命名空间中)
  • 如果您忘记了开关中的枚举常量,编译器会发出警告
  • 如果不提供显式值,则会自动指定常量的值
  • 枚举类型始终足够大,可以容纳所有常量。使用
    #define
    时,必须提交到
    int
    或某个typedef,并确保手动匹配所有常量

枚举非常有助于使代码易于阅读和理解

还有一些琐事来强调我的观点:

我读了罗伯特·C·马丁斯(Robert C.Martins)的《清洁代码》一书,并尝试遵循他的一些建议,例如,代码应该自我解释。枚举在C/C++中(对于大多数常见的编译器)没有太大帮助,因为它们表示为int,并且可以使用枚举中定义的其他值。因此,#define或const变量比较有用。但是,其他语言允许您将有效值限制为枚举中定义的值

所以,阅读和写作,让我们假设一个工作日是更方便的枚举。如果星期一是0或1或任何其他值,则无需记住。如果其他人需要理解您的代码,这一点就更为重要


dayOfweek=Monday
dayOfweek=0
更容易理解枚举与
#define
没有太大区别,除了其他人已经说过的,对我来说主要的区别是:

您可以将常量分组在一起

此外,枚举有一个基础类型,可以根据您的需要指定该类型。在C++11中,您可以使用
enum类
获得强类型和作用域的枚举,这使得枚举更加有用

一般来说,尽量避免使用预处理器,因为它不知道代码和它要做什么。不要使用单个常数的定义,而是考虑编写:

const int MY_CONSTANT = 42;

(及其定义类型化常量的所有静态、成员或命名空间变体)

编译器不会发出呼喊,因为枚举被设计为对枚举整数和整数位字段提供强大的类型化支持(很强…“一些类型支持”-C++11为真正的强类型枚举引入)


例如,我在前面的一个问题中给出了一个例子,并考虑了与用C编写相同内容时应采用的典型方法的区别,即在编写您(或其他开发人员)将要重用的类时使用
#define

,您可以使用enum来表示所述类的选项,这些选项易于阅读。比如说

class BankAccount {
      // Constructor
      BankAccount(int accountType) {
          switch(accountType) {
                case AccountType::SHARED:
                    // ...


enum AccountType {
      SHARED, SINGLE, // Etc...
所以看起来是这样的:

 new BankAccount(AccountType::SHARED);
与此相反:

 new BankAccount(0);

因为C++11中的
#define
应该避免,而
枚举类
是强类型。在这许多小阶段中,答案的增量开发是。。。危险的建议您暂时删除,在删除时进行编辑,然后在准备好后取消删除答案。它保留了您最初的回答时间。谢谢您的推荐。我将跟随你的方式在以后的帖子中发表。虽然这是真的,但这个答案似乎遗漏了什么。你能详细说明一下吗?