C++ 高级数据类型(六)—— 自定义数据类型
前面我們已經(jīng)看到過(guò)一種用戶(程序員)定義的數(shù)據(jù)類型:結(jié)構(gòu)。除此之外,還有一些其它類型的用戶自定義數(shù)據(jù)類型:
?
定義自己的數(shù)據(jù)類型 (typedef)
C++ 允許我們?cè)诂F(xiàn)有數(shù)據(jù)類型的基礎(chǔ)上定義我們自己的數(shù)據(jù)類型。我們將用關(guān)鍵字typedef來(lái)實(shí)現(xiàn)這種定義,它的形式是:
typedef existing_type new_type_name;
這里 existing_type 是C++ 基本數(shù)據(jù)類型或其它已經(jīng)被定義了的數(shù)據(jù)類型,new_type_name 是我們將要定義的新數(shù)據(jù)類型的名稱。例如:
typedef char C;typedef unsigned int WORD;
typedef char * string_t;
typedef char field [50];
在上面的例子中,我們定義了四種新的數(shù)據(jù)類型: C, WORD, string_t 和 field ,它們分別代替 char, unsigned int, char* 和 char[50] 。這樣,我們就可以安全的使用以下代碼:
C achar, anotherchar, *ptchar1;WORD myword;
string_t ptchar2;
field name;
如果在一個(gè)程序中我們反復(fù)使用一種數(shù)據(jù)類型,而在以后的版本中我們有可能改變?cè)摂?shù)據(jù)類型的情況下,typedef 就很有用了?;蛘呷绻环N數(shù)據(jù)類型的名稱太長(zhǎng),你想用一個(gè)比較短的名字來(lái)代替,也可以是用typedef。
?
聯(lián)合(Union)
聯(lián)合(Union) 使得同一段內(nèi)存可以被按照不同的數(shù)據(jù)類型來(lái)訪問(wèn),數(shù)據(jù)實(shí)際是存儲(chǔ)在同一個(gè)位置的。它的聲明和使用看起來(lái)與結(jié)構(gòu)(structure)十分相似,但實(shí)際功能是完全不同的:
union model_name {??? type1 element1;
??? type2 element2;
??? type3 element3;
??? .
??? .
} object_name;
union 中的所有被聲明的元素占據(jù)同一段內(nèi)存空間,其大小取聲明中最長(zhǎng)的元素的大小。例如:
union mytypes_t {??? char c;
??? int i;
??? float f;
} mytypes;
定義了3個(gè)元素:
mytypes.c
mytypes.i
mytypes.f
每一個(gè)是一種不同的數(shù)據(jù)類型。既然它們都指向同一段內(nèi)存空間,改變其中一個(gè)元素的值,將會(huì)影響所有其他元素的值。
union 的用途之一是將一種較長(zhǎng)的基本類型與由其它比較小的數(shù)據(jù)類型組成的結(jié)構(gòu)(structure)或數(shù)組(array)聯(lián)合使用,例如:
union mix_t{??? long l;
??? struct {
??????? short hi;
??????? short lo;
??? } s;
??? char c[4];
} mix;
以上例子中定義了3個(gè)名稱:mix.l, mix.s 和 mix.c,我們可以通過(guò)這3個(gè)名字來(lái)訪問(wèn)同一段4 bytes長(zhǎng)的內(nèi)存空間。至于使用哪一個(gè)名字來(lái)訪問(wèn),取決于我們想使用什么數(shù)據(jù)類型,是long, short 還是 char 。下圖顯示了在這個(gè)聯(lián)合(union)中各個(gè)元素在內(nèi)存中的的可能結(jié)構(gòu),以及我們?nèi)绾瓮ㄟ^(guò)不同的數(shù)據(jù)類型進(jìn)行訪問(wèn):
匿名聯(lián)合(Anonymous union)
在 C++ 我們可以選擇使聯(lián)合(union)匿名。如果我們將一個(gè)union包括在一個(gè)結(jié)構(gòu)(structure)的定義中,并且不賦予它object名稱 (就是跟在花括號(hào){}后面的名字),這個(gè)union就是匿名的。這種情況下我們可以直接使用union中元素的名字來(lái)訪問(wèn)該元素,而不需要再在前面加 union對(duì)象的名稱。在下面的例子中,我們可以看到這兩種表達(dá)方式在使用上的區(qū)別:
| 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; |
以上兩種定義的唯一區(qū)別在于左邊的定義中我們給了union一個(gè)名字price,而在右邊的定義中我們沒(méi)給。在使用時(shí)的區(qū)別是當(dāng)我們想訪問(wèn)一個(gè)對(duì)象(object)的元素dollars 和yens 時(shí),在前一種定義的情況下,需要使用:
book.price.dollars
book.price.yens
而在后面一種定義下,我們直接使用:
book.dollars
book.yens
再一次提醒,因?yàn)檫@是一個(gè)聯(lián)合(union),域dollars 和yens 占據(jù)的是同一塊內(nèi)存空間,所以它們不能被用來(lái)存儲(chǔ)兩個(gè)不同的值。也就是你可以使用一個(gè)dollars 或yens的價(jià)格,但不能同時(shí)使用兩者。
?
枚舉Enumerations (enum)
枚舉(Enumerations)可以用來(lái)生成一些任意類型的數(shù)據(jù),不只限于數(shù)字類型或字符類型,甚至常量true 和false。它的定義形式如下:
enum model_name {??? value1,
??? value2,
??? value3,
??? .
??? .
} object_name;
例如,我們可以定義一種新的變量類型叫做color_t 來(lái)存儲(chǔ)不同的顏色:
enum colors_t {black, blue, green, cyan, red, purple, yellow, white};
注意在這個(gè)定義里我們沒(méi)有使用任何基本數(shù)據(jù)類型。換句話說(shuō),我們創(chuàng)造了一種的新的數(shù)據(jù)類型,而它并沒(méi)有基于任何已存在的數(shù)據(jù)類型:類型color_t,花括號(hào){}中包括了它的所有的可能取值。例如,在定義了colors_t 列舉類型后,我們可以使用以下表達(dá)式 :
colors_t mycolor;mycolor = blue;
if (mycolor == green) mycolor = red;
實(shí)際上,我們的枚舉數(shù)據(jù)類型在編譯時(shí)是被編譯為整型數(shù)值的,而它的數(shù)值列表可以是任何指定的整型常量 。如果沒(méi)有指定常量,枚舉中第一個(gè)列出的可能值為0 ,后面的每一個(gè)值為前面一個(gè)值加1。因此,在我們前面定義的數(shù)據(jù)類型colors_t 中,black 相當(dāng)于0, blue 相當(dāng)于 1, green 相當(dāng)于2 ,后面依此類推。
如果我們?cè)诙x枚舉數(shù)據(jù)類型的時(shí)候明確指定某些可能值(例如第一個(gè))的等價(jià)整數(shù)值,后面的數(shù)值將會(huì)在此基礎(chǔ)上增加,例如:
enum months_t { january=1, february, march, april,may, june, july, august,september, october, november, december} y2k;在這個(gè)例子中,枚舉類型months_t的變量y2k 可以是12種可能取值中的任何一個(gè),從january 到 december ,它們相當(dāng)于數(shù)值1 到 12,而不是0 到 11 ,因?yàn)槲覀円呀?jīng)指定 january 等于1。
總結(jié)
以上是生活随笔為你收集整理的C++ 高级数据类型(六)—— 自定义数据类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java Eclipse下载安装教程
- 下一篇: C++ 控制结构和函数(三)—— 函数I