讲解C++中的枚举类型以及声明新类型的方法

C++枚举类型
如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型。所谓“枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。声明枚举类型用enum开头。例如:

  enum weekday{sun, mon, tue, wed, thu, fri, sat};

上面声明了一个枚举类型weekday,花括号中sun, mon, …, sat等称为枚举元素或枚举常量。表示这个类型的变量的值只能是以上7个值之一。它们是用户自己定义的标识符。

声明枚举类型的一般形式为:

  enum 枚举类型名{枚举常量表列};

在声明了枚举类型之后,可以用它来定义变量。如:

  weekday workday,week_end;

这样,workday和week_end被定义为枚举类型weekday的变量。

在C语言中,枚举类型名包括关键字enum,以上的定义可以写为:

  enum weekday workday,week_end;

在C++中允许不写enum,一般也不写enum,但保留了C的用法。根据以上对枚举类型weekday的声明,枚举变量的值只能是sun到sat之一。例如:

  workday=mon; week_end=sun;

是正确的。也可以直接定义枚举变量,如:

  enum{sun, mon, tue, wed, thu, fri, sat} workday,week_end;

这些标识符并不自动地代表什么含义。

对枚举类型的几点说明:
对枚举元素按常量处理,故称枚举常量。
枚举元素作为常量,它们是有值的,C++编译按定义时的顺序对它们赋值为0,1,2,3,…。也可以在声明枚举类型时另行指定枚举元素的值。
枚举值可以用来做判断比较。
一个整数不能直接赋给一个枚举变量。

【例】口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中任意取出3个球,问得到3种不同颜色的球的可能取法,输出每种排列的情况。

#include <iostream>
#include <iomanip>//在输出时要用到setw控制符
using namespace std;
int main( )
{
  enum color {red,yellow,blue,white,black}; //声明枚举类型color
  color pri; //定义color类型的变量pri
  int i,j,k,n=0,loop; //n是累计不同颜色的组合数
  for (i=red;i<=black;i++) //当i为某一颜色时
   for (j=red;j<=black;j++) //当j为某一颜色时
     if (i!=j) //若前两个球的颜色不同
     {
      for (k=red;k<=black;k++) //只有前两个球的颜色不同,才需要检查第3个球的颜色
        if ((k!=i) && (k!=j)) //3个球的颜色都不同
        {
         n=n+1;//使累计值n加1
         cout<<setw(3)<<n; //输出当前的n值,字段宽度为3
         for (loop=1;loop<=3;loop++) //先后对3个球作处理
         {
           switch (loop) //loop的值先后为1,2,3
           {
             case 1: pri=color(i);break ; //color(i)是强制类型转换,使pri的值为i
             case 2: pri=color(j);break ; //使pri的值为j
             case 3: pri=color(k);break ; //使pri的值为k
             default :break ;
      }
      switch (pri)//判断pri的值,输出相应的“颜色”
      {
        case red: cout<<setw(8)<<"red"; break;
        case yellow: cout<<setw(8)<<"yellow";break;
        case blue:cout<<setw(8)<<"blue"; break ;
        case white:cout<<setw(8)<<"white"; break ;
        case black:cout<<setw(8)<<"black"; break ;
        default : break ;
      }
     }
     cout<<endl;
   }
  }
  cout<<"total:"<<n<<endl; //输出符合条件的组合的个数
  return 0;
}

运行结果如下:

1 red yellow blue 2 red yellow white 3 red yellow black
┆
┆
┆
58 black white red
59 black white yellow
60 black white blue
total:60

不用枚举常量,而用常数0代表“红”,1代表“黄”……也可以。但显然用枚举变量更直观,因为枚举元素都选用了令人“见名知意”的标识符,而且枚举变量的值限制在定义时规 定的几个枚举元素范围如果赋予它一个其他的值,就会出现出错信息,便于检查。

C++ typedef 声明新类型
在C++中,除了可以声明结构体、共用体、枚举等类型外,还可以用typedef声明一个新的类型名来代替已有的类型如:

  • typedef int INTEGER;  //指定用标识符INTEGER代表int类型
  • typedef float REAL;  //指定用REAL代表float类型

这样,以下两行等价:

  • int i,j; float a,b;
  • INTEGER i,j; REAL a,b;

这样可以使熟悉FORTRAN的人能用INTEGER和REAL定义变量,以适应他们的习惯。

如果在一个程序中,整型变量是专门用来计数的,可以用COUNT来作为整型类型名:

  typedef int COUNT; //指定用COUNT代表int型
  COUNT i,j; //将变量i,j定义为COUNT类型

即int类型在程序中将变量i, j定义为COUNT类型,可以使人更一目了然地知道它们是用于计数的。

也可以声明结构体类型:

typedef struct //注意在struct之前用了关键字typedef,表示是声明新名
{
  int month; int day; int year;
}DATE; //注意DATE是新类型名,而不是结构体变量名

所声明的新类型名DATE代表上面指定的一个结构体类型。这样就可以用DATE定义变量:
    DATE birthday; DATE *p;  //p为指向此结构体类型数据的指针
还可以进一步:

typedef int NUM[100]; //声明NUM为整型数组类型,包含100个元素
NUM n; //定义n为包含100个整型元素的数组
typedef char *STRING; //声明STRING为字符指针类型
STRING p,s[10]; //p为字符指针变量,s为指针数组(有10个元素)
typedef int (*POINTER)( ) //声明POINTER为指向函数的指针类型,函数返回整型值
POINTER p1, p2; // p1,p2为POINTER类型的指针变量

归纳起来,声明一个新的类型名的方法是:

  • 先按定义变量的方法写出定义语句(如int i;)。
  • 将变量名换成新类型名(如将i换成COUNT)。
  • 在最前面加typedef(如typedef int COUNT)。
  • 然后可以用新类型名去定义变量。

再以声明上述的数组类型为例来说明:

  • 先按定义数组形式书写: int n[100];
  • 将变量名n换成自己指定的类型名:int NUM[100];
  • 在前面加上typedef,得到 typedef int NUM[100];
  • 用来定义变量: NUM n;(n是包含100个整型元素的数组)。

习惯上常把用typedef声明的类型名用大写字母表示,以便与系统提供的标准类型标识符相区别。

关于typedef的几点说明:

  • typedef可以声明各种类型名,但不能用来定义变量。用typedef可以声明数组类型、字符串类型,使用比较方便。
  • 用typedef只是对已经存在的类型增加一个类型名,而没有创造新的类型。
  • 当在不同源文件中用到同一类型数据(尤其是像数组、指针、结构体、共用体等类型数据)时,常用typedef声明一些数据类型,把它们单独放在一个头文件中,然后在需要用到它们的文件中用#include命令把它们包含进来,以提高编程效率。
  • 使用typedef有利于程序的通用与移植。有时程序会依赖于硬件特性,用typedef便于移植。
(0)

相关推荐

  • C++基础入门教程(四):枚举和指针

    我已经把<C++ Primer>一书准备好了,如果这本<C++ Primer Plus>继续这么瞎闹的话,我就换主角~! 没错,这书连if while都还没介绍呢,就开始把指针搬出来了,虽然只是简单介绍.. 这目录编排我也是醒了. 那么,按照书上的进度,今天来初步说说指针. 但,今天周五,你懂的,就随便水一下,因为我怕到周一又忘了. 1.枚举 那么,枚举是什么呢?(小若:等等~!说好的指针呢?) 大部分高级语言里应该都有枚举了,所以也没什么好介绍的. 使用是这样的: 复制代码 代码

  • js判断客户端是iOS还是Android等移动终端的方法

    判断原理: JavaScript是前端开发的主要语言,我们可以通过编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性来分辨,另一种是通过分析浏览器的userAgent属性来判断的.在许多情况下,值判断出浏览器类型之后,还需判断浏览器版本才能处理兼容性问题,而判断浏览器的版本一般只能通过分析浏览器的userAgent才能知道. 浏览器类型 ⑴浏览器特有属性 ⑵根据userAgent 浏览器版本 ⑴根据userAge

  • iOS开发之枚举用法小结

    前言 Enum,也就是枚举,从C语言开始就有了,C++.Java.Objective-C.Swift这些语言,当然都有对应的枚举类型,功能可能有多有少,但是最核心的还是一个-规范的定义代码中的状态.选项等"常量". 举个例子,我们想要在开发中根据四季的变化做不同的操作,我们首先想到的可能会是定义一个int型变量,通过为该变量赋不同的值来表示四季(e.g. 1为春天,2为夏天,3为秋天,4为冬天).但是,对于阅读该份代码的人来讲,他们并不能在短时间内就明白数字1234所代表的具体含义.这

  • C语言 枚举类型(Enum)详解及示例代码

    在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等. 以每周七天为例,我们可以使用#define命令来给每天指定一个名字: #include <stdio.h> #define Mon 1 #define Tues 2 #define Wed 3 #define Thurs 4 #define Fri 5 #define Sat 6 #define Sun 7 in

  • JS辨别访问浏览器判断是android还是ios系统

    项目中需要扫描二维码之后自动分辨出是android还是ios系统,针对于不同的系统进行不同的下载. <script type="text/javascript"> /* * 智能机浏览器版本信息: * */ var browser = { versions: function() { var u = navigator.userAgent, app = navigator.appVersion; return {//移动终端浏览器版本信息 trident: u.indexO

  • IOS开发代码分享之设置UISearchBar的背景颜色

    今天用到UISearchBar,之前网上提供的方法已经不能有效的去除掉它的背景色了,修改背景色方法如下: mySearchBar.backgroundColor = RGBACOLOR(249,249,249,1);     mySearchBar.backgroundImage = [self imageWithColor:[UIColor clearColor] size:mySearchBar.bounds.size];   //取消searchbar背景色 - (UIImage *)im

  • iOS开发中WebView的基本使用方法简介

    1.使用UIWebView加载网页 运行XCode 4.3,新建一个Single View Application,命名为WebViewDemo. 2.加载WebView 在ViewController.h添加WebView成员变量和在ViewController.m添加实现 复制代码 代码如下: #import <UIKit/UIKit.h> @interface ViewController : UIViewController {     UIWebView *webView; } @e

  • IOS获取各种文件目录路径的方法

    iphone沙箱模型有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory()), 手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下.这个目录用于存储用户数据或其它应该定期备份的信息. 2.AppName.app 目录:这是应用程序的程序包目录,包

  • iOS开发之路--仿网易抽屉效果

    最终效果图: MainStoryBoard示意图: BeyondViewController.h // // BeyondViewController.h // 19_抽屉效果_仿网易 // // Created by beyond on 14-8-1. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import <UIKit/UIKit.h> #import "LeftTableViewControllerD

  • IOS开发代码分享之用nstimer实现倒计时功能

    用nstimer实现倒计时功能,废话不多说,直接上代码,详细解释请参照注释 // [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES];   // - (void)timerFireMethod:(NSTimer *)theTimer {     BOOL timeStart = YES;     NSCalend

  • 结合C++11的新特性来解析C++中的枚举与联合

    枚举 枚举是用户定义的类型,其中包含一组称为枚举器的命名的整型常数. 语法 // unscoped enum: enum [identifier] [: type] {enum-list}; // scoped enum: enum [class|struct] [identifier] [: type] {enum-list}; // Forward declaration of enumerations (C++11): enum A : int; // non-scoped enum mu

随机推荐