(十一)开创自己的数据类型:类的开始

来源:互联网 发布:淘宝10元麦克风 编辑:程序博客网 时间:2024/06/06 01:59

1、类是用户定义的数据类型,定义时用class

      typedef   不创建新类型,仅为已有类型定义别名。

      枚举         独特的类型,但它不是一个类。

       类            全新的,原始的类型。可应用于类对象的操作,完全由用户定义。

     union和struct创建的新类型,从技术上来看它们都是类。



2、结构类型:struct

       struct  Book{

              char  title[80];

              char author[80];

              int year;

        };

       1、每个元素,由基本元素或已经定义的自定义元素组成,并以分号结束。 此元素又称“数据成员”或“成员”。

        2、类型定义完成后以分号结束。

        3、可以用sizeof来计算一个自定义类型的所点大小。(注意边界对齐,后章介绍)

        4、结构内不能包括自己结构的类型,这样将出现死循环。可以有自身类型的指针。

        5、可以在最后右花括号侧定义这种类型的变量。

        6、聚合:可以用初始化列表来初始化对象时,称聚合。如果其成员包含有类类型,则不能用聚合来初始化。若列表值少于成员数,则以0来初始那些未初始的。

                 注意这个可以用于基本类型如:int  a={3};



3、访问成员用.  即句点,如:a.length

       成员可以是函数,其函数体可在内部定义:

struct Box{double length;double width;double height;double volume(){return length*width*height;}};
        函数体也可在结构体外定义:
struct Box{double length;double width;double height;double volume();};double Box::volume(){return length*width*height;}

          和类一样,体外的函数前面必须有Box类似的限定,表明这个是其中的成员函数,与其它函数是不同的。

        和头文件一样,体外定义是我们的首选,这样,声明与定义分开,便于组织代码,有时还会用到预编译中的东东。

       注意:同一类型的多个对象,其函数代码只在内存中有一个副本。



4、结构体类型的指针:

    定义:   Box *p=&a

               或:  Box *p=new  box;//在自由存储区分配,并将指针给p,注意其内容是野值,须明确地初始化。最后要delete p进行扫尾

   使用:     (*p).length=3.2;   //注意必须用括号,因为.点运算比解除指针*更优先,不加括号会先用点再*

                    p->length=3.2;     // 这种更常用。


5、联合类型 union         由于最初内存很贵,为了节约内存而使用同一块内存“不同时期”存储不同的类型的值。以节约内存。

       因此sizeof的结果就是这个结构中最大数据类型的长度。

       union  shareLD

       {   long  Lval;

           Double Dval;

       };

      同结构一样,元素(成员)有分号,结尾有分号。不同的是,某一时期只有一种结果(类型)存储在内,若强制用另一个成员类型显示,会有奇异结果出现。

      当用初始化列表初始化时,总是初始化第一个元素。否则,你应单独列出后面元素进行初始化

       shareLD   ok={3.5};   //只会初始化Lval,否则你应单独用ok.Dval=3.5进行初始化。


6、匿名联合:没有类型名称的联合

     union 

      {   char *p;

          long  Lval;

          double Dval;

      };             //没有类型名,这样的联合类型,则直接使用成员员进行引用或赋值。

     匿名union还具有以下约束:
  1).因为匿名联合不使用点运算符,所以包含在匿名联合内的元素必须是数据,不允许有成员函数,也不能包含私有或受保护的成员;
  2).全局匿名联合必须是静态(static)的,否则就必须放在匿名名字空间中.

       网友的评价:

        直接在类里定义成为类的成员吧,我记得是这么用的
       曾经看过一个UI库,他把大小相同的类型都放在一个联合里面,这样就不用类型转换了
        其实联合主要用作类型转换


7、各类型的“联合演出”
enum Type={Double,Float,Long,Int};//枚举类型,注意大写 struct shareDate{union  //匿名联合 {double dData;float  fData;long   lData;    int    iData;};Type type;//枚举类型 };shareDate value={2.5,Double};//同value={2.5},列表总初始化第一个 } if(value.type==Long) value.lData++;//应用情况 













原创粉丝点击