*********************************************************
原文:http://www.cplusplus.com/doc/tutorial/
*********************************************************
原文:http://www.cplusplus.com/doc/tutorial/
*********************************************************
其他数据类型
|
被定义的数据类型
(typedef)
C++
允许我们基于现有的数据类型来定义我们自己的类型。我们可以通过使用关键字
typedef
来实现,它的形式为:
typedef existing_type new_type_name ;
其中
existing_type
是一个
C++
的基本类型或一个复合类型,
new_type_name
是我们定义的新类型的名字。例如:
<script type="text/javascript" src="http://ads.adbrite.com/mb/text_group.php?sid=170596&col=3&br=1"></script>
typedef char C;
typedef unsigned int WORD;
typedef char * pChar;
typedef char field [50];
|
在这个情况里我们定义了四个数据类型:作为
char
的
C
、作为
unsigned
int
的
WORD
、作为
char *
的
pChar
和作为
char[50]
的
field
,此后我们就可以像用任何其他的有效类型那样把他们用在声明中:
C mychar, anotherchar, *ptc1;
WORD myword;
pChar ptc2;
field name;
|
typedef
并没有创建不同的类型。它只是创建了现有类型的同义词。那意味着
myword
的类型可以认为是
WORD
也可以认为是
unsigned int
,因为它们两个实际上是同一个类型。
typedef
对于定义在一个程序中经常使用的类型的别名非常有用。它也对于定义那些我们可能会需要在以后更改类型来变化我们德程序的那些类型很有用,或者如果一个你想用的类型有一个很长或令人困惑的名字时也很有用。
共用体(
Unions
)
共用体允许同一块内存被作为不同的数据类型来访问,因为实际上他们全部在相同的内存区域。它的声明和使用同一个结构很相似,只是它的功能完全不同:
union union_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;
在共用体中声明的全部元素都占据内存中相同的物理空间。它的大小是声明的元素中最大的那个元素的大小。例如:
union mytypes_t {
char c;
int i;
float f;
} mytypes;
|
定义三个元素:
mytypes.c
mytypes.i
mytypes.f
|
每一个都有一个不同的数据类型。因为它们全部使用内存中相同的区域,对其中一个元素的修改将影响全部元素的值。我们不能为它们中的每一个都独立于其他的来存储不同的值。
使用共用体的一个情况可能是合并一个基本类型和一个数组或拥有较小元素的结构体。例如:
union mix_t {
long l;
struct {
short hi;
short lo;
} s;
char c[4];
} mix;
|
定义了三个可以访问同一组
4
字节的三个名字:
mix.l
,
mix.s
和
mix.c
,我们可以根据我们想如何访问这些字节来使用这些名字,分别得可以把它们看成一个单独的
long
型数据,看成是两个
short
元素或者是一个带有
char
元素的数组。我把类型混合起来了,在这个共用体中有数组和结构体因此你可以了解我们可以访问这些数据的不同方法。对于一个
little-endian
(小
endian,
用最小的地址储存最少的重要字节
(
而用最大的地址储存最多的重要字节
)
的计算机记忆力)系统(主要是
PC
平台),这个共用体可以描绘为:
![](http://www.cplusplus.com/doc/files/14-imgunio1.gif)
确切的组合和共用体成员在内存中的顺序是平台相关的。因此要注意使用这种类型带来的可能问题。
匿名(
Anonymous
)共用体
在
C++
中我们可以选择声明匿名的共用体。如果我们声明一个不带任何名字的共用体,那么这个共用体将是匿名的;并且我们可以直接通过它们成员的名字访问它们的成员。例如,注意下面这两个结构体声明的区别:
带有普通共用体的结构体
|
带有匿名共用体的结构体
|
struct { char title[50]; char author[50]; union { float dollars; int yens; } price; } book; |
struct { char title[50]; char author[50]; union { float dollars; int yens; }; } book; |
这两个代码片断的唯一的不同是:在第一个中我们给了共用体一个名字(
price
),而在第二个中我们却没有给。当我们访问一个这种类型的对象的成员
dollars
和
yens
时,区别就可以看到了。对于第一种类型的一个对象,它应该是:
book.price.dollars
book.price.yens
|
而对于第二种类型的一个对象,它应该是:
book.dollars
book.yens
|
我再一次的提醒你:因为它一个共用体而不是一个结构体,成员
dollars
和
yens
占有内存中相同的物理空间,因此它们不能同时存储两个不同的值。你可以为在
dollars
或
yens
中为
price
设置一个值,当不是对它们两个同时。
枚举
(enum)
枚举创建包含一些不同值的新的数据类型,它包含的不局限于基本数据类型所可以带的值。它的形式如下:
enum enumeration_name {
value1,
value2,
value3,
.
.
} object_names;
value1,
value2,
value3,
.
.
} object_names;
例如,我们可以用下面的声明来创建一个叫做
color
的用来存储颜色的新的变量类型:
enum colors_t {black, blue, green, cyan, red, purple, yellow, white};
|
注意我们在声明中没有包含任何基本数据类型。从某种角度来说,我们创建了一个全新的数据类型,从一开始就没有基于任何其他现存的类型。这个新类型
color_t
的变量可能带有的值就是那些被括在花括号中的新的常量。例如,一旦枚举
colors_t
被声明了,下面的表达式将是有效的:
colors_t mycolor;
mycolor = blue;
if (mycolor == green) mycolor = red;
|
枚举和数值变量是类型兼容的,因此它们的常量通常在内部被分配一个整型数值量。如果没有特别说明,对一个可能值对应的整型量等于
0
,并且后面的遵循
a+1
规则。因此,在我们上面定义的我们数据类型
colors_t
中,
black
等价于
0
、
blue
将等价于
1
、
green
等价于
2
,等等。
我们可以为我们的枚举类型可以带的任何一个常量都明确的指定一个整型值。如果跟在其(被指定了值的常量)后的常量我们没有给一个整型量的话,它将被自动赋予前一个常量的值加一的值。例如:
enum months_t { january=1, february, march, april,
may, june, july, august,
september, october, november, december} y2k;
|
在这个情况中,
months_t
类型的变量
y2k
包含任意
12
个可能的值,这些值从
january
(一月)到
december
(十二月)等价的值从
1
到
12
(而不是从
0
到
11
,因为我们令
january
(一月)等价于
1
)。