C++语言指南(十七)——其他数据类型

*********************************************************
原文: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;
在共用体中声明的全部元素都占据内存中相同的物理空间。它的大小是声明的元素中最大的那个元素的大小。例如:
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 平台),这个共用体可以描绘为:
确切的组合和共用体成员在内存中的顺序是平台相关的。因此要注意使用这种类型带来的可能问题。
匿名( 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;
例如,我们可以用下面的声明来创建一个叫做 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 )。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值