*********************************************************
原文:http://www.cplusplus.com/doc/tutorial/
*********************************************************
被定義的資料類型
(typedef)C++允許我們基於現有的資料類型來定義我們自己的類型。我們可以通過使用關鍵字
typedef來實現,它的形式為:
typedef existing_type new_type_name ;其中
existing_type是一個C++的基本類型或一個複合類型,
new_type_name是我們定義的新類型的名字。例如:
Your Ad Here
| 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.cmytypes.imytypes.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.dollarsbook.price.yens |
而對於第二種類型的一個對象,它應該是:
我再一次的提醒你:因為它一個共用體而不是一個結構體,成員dollars和yens佔有記憶體中相同的物理空間,因此它們不能同時儲存兩個不同的值。你可以為在dollars或yens中為price設定一個值,當不是對它們兩個同時。
枚舉
(enum)枚舉建立包含一些不同值的新的資料類型,它包含的不局限於基礎資料型別 (Elementary Data Type)所可以帶的值。它的形式如下:
enum enumeration_name {
value1,
value2,
value3,
.
.
} object_names;例如,我們可以用下面的聲明來建立一個叫做
color的用來儲存顏色的新的變數類型:
| enum colors_t {black, blue, green, cyan, red, purple, yellow, white}; |
注意我們在聲明中沒有包含任何基礎資料型別 (Elementary Data Type)。從某種角度來說,我們建立了一個全新的資料類型,從一開始就沒有基於任何其他現存的類型。這個新類型
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)。