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

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++;//应用情况 













  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值