C 高階資料型別(六) 自定義資料型別

2022-07-18 05:48:09 字數 2890 閱讀 7054

c++ 允許我們在現有資料型別的基礎上定義我們自己的資料型別。我們將用關鍵字typedef來實現這種定義,它的形式是:

typedef existing_type new_type_name;

這裡 existing_type 是c++ 基本資料型別或其它已經被定義了的資料型別,new_type_name 是我們將要定義的新資料型別的名稱。例如:

typedef char c;

typedef unsigned int word;

typedef char * string_t;

typedef char field [50];

在上面的例子中,我們定義了四種新的資料型別: c, word, string_t 和 field ,它們分別代替 char, unsigned int, char* 和 char[50] 。這樣,我們就可以安全的使用以下**:

c achar, anotherchar, *ptchar1;

word myword;

string_t ptchar2;

field name;

如果在乙個程式中我們反覆使用一種資料型別,而在以後的版本中我們有可能改變該資料型別的情況下,typedef 就很有用了。或者如果一種資料型別的名稱太長,你想用乙個比較短的名字來代替,也可以是用typedef。

聯合(union) 使得同一段記憶體可以被按照不同的資料型別來訪問,資料實際是儲存在同乙個位置的。它的宣告和使用看起來與結構(structure)十分相似,但實際功能是完全不同的:

union model_name object_name;

union 中的所有被宣告的元素佔據同一段記憶體空間,其大小取宣告中最長的元素的大小。例如:

union mytypes_t mytypes;

定義了3個元素:

mytypes.c

mytypes.i

mytypes.f

每乙個是一種不同的資料型別。既然它們都指向同一段記憶體空間,改變其中乙個元素的值,將會影響所有其他元素的值。

union 的用途之一是將一種較長的基本型別與由其它比較小的資料型別組成的結構(structure)或陣列(array)聯合使用,例如:

union mix_t s;

char c[4];

} mix;

以上例子中定義了3個名稱:mix.l, mix.s 和 mix.c,我們可以通過這3個名字來訪問同一段4 bytes長的記憶體空間。至於使用哪乙個名字來訪問,取決於我們想使用什麼資料型別,是long, short 還是 char 。下圖顯示了在這個聯合(union)中各個元素在記憶體中的的可能結構,以及我們如何通過不同的資料型別進行訪問:

在 c++ 我們可以選擇使聯合(union)匿名。如果我們將乙個union包括在乙個結構(structure)的定義中,並且不賦予它object名稱 (就是跟在花括號{}後面的名字),這個union就是匿名的。這種情況下我們可以直接使用union中元素的名字來訪問該元素,而不需要再在前面加 union物件的名稱。在下面的例子中,我們可以看到這兩種表達方式在使用上的區別:

union

anonymous union

struct price;

} book;

struct ;

} book;

以上兩種定義的唯一區別在於左邊的定義中我們給了union乙個名字price,而在右邊的定義中我們沒給。在使用時的區別是當我們想訪問乙個物件(object)的元素dollars 和yens 時,在前一種定義的情況下,需要使用:

book.price.dollars

book.price.yens

而在後面一種定義下,我們直接使用:

book.dollars

book.yens

再一次提醒,因為這是乙個聯合(union),域dollars 和yens 佔據的是同一塊記憶體空間,所以它們不能被用來儲存兩個不同的值。也就是你可以使用乙個dollars 或yens的**,但不能同時使用兩者。

列舉(enumerations)可以用來生成一些任意型別的資料,不只限於數字型別或字元型別,甚至常量true 和false。它的定義形式如下:

enum model_name object_name;

例如,我們可以定義一種新的變數型別叫做color_t 來儲存不同的顏色:

enum colors_t ;

注意在這個定義裡我們沒有使用任何基本資料型別。換句話說,我們創造了一種的新的資料型別,而它並沒有基於任何已存在的資料型別:型別color_t,花括號{}中包括了它的所有的可能取值。例如,在定義了colors_t 列舉型別後,我們可以使用以下表示式 :

colors_t mycolor;

mycolor = blue;

if (mycolor == green) mycolor = red;

實際上,我們的列舉資料型別在編譯時是被編譯為整型數值的,而它的數值列表可以是任何指定的整型常量 。如果沒有指定常量,列舉中第乙個列出的可能值為0 ,後面的每乙個值為前面乙個值加1。因此,在我們前面定義的資料型別colors_t 中,black 相當於0, blue 相當於 1, green 相當於2 ,後面依此類推。

如果我們在定義列舉資料型別的時候明確指定某些可能值(例如第乙個)的等價整數值,後面的數值將會在此基礎上增加,例如:

1

enum months_t y2k;

在這個例子中,列舉型別months_t的變數y2k 可以是12種可能取值中的任何乙個,從january 到 december ,它們相當於數值1 到 12,而不是0 到 11 ,因為我們已經指定 january 等於1。

C 高階資料型別(六) 自定義資料型別

前面我們已經看到過一種使用者 程式設計師 定義的資料型別 結構。除此之外,還有一些其它型別的使用者自定義資料型別 c 允許我們在現有資料型別的基礎上定義我們自己的資料型別。我們將用關鍵字typedef來實現這種定義,它的形式是 typedef existing type new type name ...

C 自定義資料型別

c 除了提供多種基本的資料型別 如 int float double char等 供使用者使用外,還允許使用者根據需要自己宣告一些型別,例如陣列 結構體 structure 型別 共用體 union 型別 列舉 enumeration 型別 類 class 型別等,這些統稱為 使用者自定義型別 us...

C 自定義資料型別

c 中有以下幾種自定義資料型別方式 typedef union enum typedef只是用於重新命名一種已有的資料型別。typedef char c c c即char c typedef char field 50 field s即char 50 注意第二種用法,陣列的維數 50 是寫在最後的。...