第7章 自定义数据类型
7.1结构structure
定义一组数据,组合起来表示一种类型,如:
struct point
{
double x;
double y;
};
7.1.1结构的定义
语法如下:
struct 结构名
{
成员列表
};
结构可以包含多个数据成员(data member),他们在“{}”之间定义,可以定义没有任何成员的结构
7.1.2 定义结构变量
结构为编译器引入了一个新的类型,可以定义属于某个结构的变量,如:
point p1;
point p2,p3;
也可以定义point结构的指针变量和引用变量,如:
point *pp = &p1;
point &p4 = p2;
这里定义了一个指针变量pp,他指向p1的对象。
也可以使用new来动态创建一个结构:
int* ip = new int;
point *pp = new point;
7.1.3结构的数据成员
数据成员类型可以是 基本类型、复合类型(数组、指针、引用),扩展结构(结构、联合、枚举、类)
7.1.4结构成员的引用
可以使用“.”来引用某个结构实例的成员,如:
point p1;
p1.x = 100;
p1.y = p1.x;
指向结构对象的指针,如:
point *pp = &p1;
(*pp).x = 100;
(*pp).y = (*pp).x
针对指针,完全可以使用另外一种方式替换以上繁琐的方法:
pp->x = 100;
pp->y = pp->x;
“->”作用在结构指针上,同样用以引用结构的成员
7.1.5结构的初始化
如:point p1={100,200};
结构的初始值可以少于其成员的个数,未被覆盖的数据成员会被初始化为0
point p2 = {100};// ok, p2.y=0
常见错误:
使用了未初始化的结构成员
制订了太多的初始值
7.1.6位域bit fields
定义结构时,可以指定每个数据成员所占的比特位数(bits),这时数据成员则可以称作位域,如:
struct compacttime
{
unsigned hour : 5; //5bits,0-31
unsigned minute : 6; //6 bits, 0-63
unsigned second: 6; //6 bits,0-63
};
cout<<sizeof(compactime)<<endl;
输出结果为4,小于未定义之前的12字节,位域可以实现讲一个字节掰成几块来用
7.2联合union
7.2.1定义
联合的所有成员公用一块内存,如:
union mypoint
{
double x;
double y;
};
联合由关键词“union”指定
7.2.2使用联合
联合各成员的字节长度不必相等,其占用空间取决与其中最常的成员。
7.3枚举enumeration
7.3.1枚举定义
习惯上,枚举常量的名字总是大写
7.3.2枚举与int
枚举值的第一个成员对应于证书0,第二个为1,依此类推。
也可以手动指定每个枚举值
7.4 typedof
typedef提供了为某种既有类型取别名的功能,如:
typedef Point Point1; //ok,位同一个类型定义多个别名
typedef Point1 Point2 ;//ok,可以为别名在定义别名
typedef也可以为指针类型定义别名
7.5 数据类型修饰符
7.5.1 const(constant)
称为常量,或常数变量,注意与字面常量的区别。const变量还是一个变量,具有自己的内存地址,不过它的值不能被更改。
必须要定义的时候进行初始化,如:
const int I =100; //ok
区分:指针常量是该指针是一个常量;常量指针是指向常量的指针
int* ip0=&i; //非const
int * const ip1 = &i; //const修饰int*
int const * ip2 =&i; //const修饰Int
const int * ip3 = &i; // const修饰Int
const int * const ip4 = &i; // const同时修饰ip4和ip4*
ip1是指针常量,ip1指针不能被指来指去
ip2和ip3是常量指针,本身可以被指来指去,但是指向内容制度,不能被修改
ip4综合了2种特点。
指向const的指针不能被赋给指向非const的指针,如:
int *ip5 =ip2;//error:初始化:无法从const int*转换为int *
7.5.2 volatile