zoukankan      html  css  js  c++  java
  • 对枚举类型、结构类型的一些认识

                什么是枚举

           枚举(enumeration),就是一组字面(单词),每个字面对应一个字面值。

               枚举有什么用处

           例如,需要把一年四季在程序中表示出来,可能会用0,1,2,3,分别表示一年四季中的春、夏、秋、冬。这样不能直观的表示出是哪个季节,另外这样的代码不能成为健壮的代码。假设,我们在程序中定义了一个int类型的变量seaSon,用它来存入季节。此时,可以把超出定义四季范围内的int类型数字赋值给seaSon.

    int seaSon=5; //这行代码是合法的,不会报错。但是,5代表一年四季中哪个季节?

      枚举类型,就可以解决这些问题。

              怎么定义枚举

    enum  Season
    {
        Spring,Summer,Fall,Winter;  //Spring=0,Summer=1,Fall=2,Winter=3.默认第一个成员的字面值为0
                                                    //剩下的成员,按前面的成员字面值增加1.(第一个除外,它默认是0)
    }
    
    
    enum Season
    {
         Spring=1,Summer,Fall=4,Winter; //此时Spring=1,Summer=2,Fall=4,Winter=5;
    }

    默认情况下,枚举中的字面值为int类型,我们可以改为其他整数类型。例如:short,byte,sbyte,ushort,int,uint,long,ulong.

    enum Season: short{Spring,Summer,Fall,Winter}  //将字面值改为short类型

    怎样使用枚举类型

    enum Season
    {
         Spring,Summer,Fall,Winter;
    }
    
    
    Season colorful=Season.Fall;
    Season  colorful_1=Season.Summer;      //初始化枚举类型的变量时,只能赋给枚举中定义的值。

    适用于枚举的运算符

    因为枚举中的字面值只能为整数类型,所以适用于整数类型的运算符都适用于枚举类型。(bitwise、shift除外)。

    Static void doWork()
    {
          Season first=Season.Spring;
         for(int i=0;i<4;i++)
        { 
        Console.WriteLine(first);     //依次输出Spring,Summer,Fall,Winter.   
         first++;       //自增运算符
        }
         Console.WriteLine(first);   //此时first超越了枚举定义的范围,此时f输出4。  
         
    }

    什么是结构

    跟类很相似,有自己的字段,方法,构造方法。

    结构有什么用处

    当一个类中存放的数据非常少,此时创建这个类所消耗的内存资源与它所存的数据不成比例。此时,我们可以考虑用结构来代替类。因为结构是值类型,存放在栈上,就减少了内存的开销。

    怎样定义结构

    structure Time
    {
     private int hours,minutes,seconds;
    
    public Time(int hh, int mm,int ss)
    {
           this.hours=hh;
          this.minutes=mm;
         this.ss=ss;
    }
    
    pulbic int Hours()
    {
          return this.hours;
    }
    }

    结构与类的区别

    结构与类的区别有以下两种:

    1.不能自己定义默认的构造方法.(没有参数的构造方法)。以下代码,如果是类,不会报错。

    structure Time
    {
        public Time()
    {
                            //会报错,结构类型不允许自己定义默认的构造方法。
    }
    }

    因为,编译器在编译时,如果发现类中没有构造方法,就会自动生成一个。如果类中有构造方法,就不会自动生成。编译器不关结构中有没有构造方法,都会自动生成构造方法。与类中的默认构造方法一样,结构中的构造方法,会把结构中的字段根据所对应的类型初始化为null,0,false.可以通过非默认构造函数改变字段值。初始化结构中的字段,必须全部初始化。

    struct Time
    {
        private int hours,minutes,seconds;
        
         public Time(int hh, int mm)
    {
                   this.hours=hh;
                  this.minutes=mm;
                  //会报错,seconds没有初始化
    }
    }

    2.在类中,我们可以定义字段时初始化,但是在结构中不可以。

    struct time
    {
     private int hours=0;  //报错,定义时不能初始化
     private int minutes;
     private int seconds;
    }

    理解结构初始化

    Time now=new Time();   //我们创建了一个结构类型的对象now。new这个关键字调用了Time结构的                                       //默认构造函数,把它的字段初始化为0.
                                         //因为结构是值类型,我们也可以这样:
                                        //Time now;
             //但是此时,访问now中的任意成员,都会报错。因为没有初始化now中的字段,它们都是         //uninitialized状态。

    我们创建了一个结构类型的对象now。new这个关键字调用了Time结构的默认构造函数,把它的字段初始化为0.
    因为结构是值类型,我们也可以这样:
    Time now;
    但是此时,访问now中的任意成员,都会报错。因为没有初始化now中的字段,它们都是uninitialized状态。

  • 相关阅读:
    C# Winform 国际化
    Could not find method google() for arguments [] on repository container,rn 集成react-native-camera 出现此错误的解决方法
    RN集成echarts4图表组件react-native-secharts(转载)
    DataGridView设置行高
    react native原生模块引用本地jar包
    react-native-printer
    phpstudy连接SQL Server 2008数据库 以及 php使用sql server出现乱码解决方式
    Apache崩掉:为进程配置合适的线程数
    引用静态资源时加上时间戳,处理浏览器缓存问题
    利用存储过程优化复杂的数据库操作
  • 原文地址:https://www.cnblogs.com/VitoCorleone/p/4611079.html
Copyright © 2011-2022 走看看