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)的,否则就必须放在匿名名字空间中.
网友的评价:
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++;//应用情况