當内置基本資料類型不能滿足需求時,就需要自定義資料類型。主要有:枚舉類型、結構類型、聯合類型、數組類型和類。
1.枚舉類型
有當遇到描述一件事情時隻能取幾個有限值的情況,比如,一周七天(我們可以用0到6整數表示周一至周日),比賽結果隻有勝、負、平等。如果我們用整數來表示星期幾那就需要判斷是不是在0到6之間的合法值,但如果用枚舉類型定義就沒有這種問題,因為枚舉類型就那幾個可能的值。
枚舉類型的聲明形式為:
enum 枚舉類型名 { 變量值清單 }; //變量值清單裡都是整型變量,結尾是分号
如:
enum weekday {sun,mon,tue,wed,thu,fri,sat};
上面沒有指定具體數值,預設依次為0,1,2….6,即sun為零,依次對應。
同樣,我們可以在聲明enum類型時指定值、
enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat};
上面tue等在mon的基礎上依次遞增。enum元素按常量處理,除了聲明之外不能對它們指派。如sun=0;這樣是非法的。
可以定義枚舉類型的變量。整數值需要賦給枚舉變量時,應進行強制類型轉換。
#include <iostream>
using namespace std;
enum game_result {WIN,LOSE,CANCEL};
int main()
{
game_result g; // 聲明變量時,可以不寫關鍵字enum
enum game_result r=CANCEL; // 也可以在類型名前寫上關鍵字enum
int count;
for(count=WIN;count<=CANCEL;++count)
{
g=(game_result)count; //整數賦給enum變量,強制轉換
if(g==r)
cout<<"CANCEL"<<endl;
else if(g==WIN)
cout<<"WIN"<<endl;
else
cout<<"LOSE"<<endl;
}
return 0;
}
2.結構體
由相同或不同類型組合成的一個整體。
struct 結構體名
{
資料類型 成員名 1;
資料類型 成員名 2;
:
資料類型 成員名 n;
}; //結尾分号
結構體變量占用記憶體的大小:sizeof(結構體類型名或變量名)
3.聯合體
有的時候需要幾個不同類型的變量共用一組記憶體單元,這時就需要用聯合體,聯合體類型聲明的文法形式為:
union 聯合名
{
資料類型 成員名 1;
資料類型 成員名 2;
:
資料類型 成員名 n;
};
同樣變量的引用形式為:聯合體變量名.成員名
union exa
{
char c_data;
short s_data;
long l_data;
};
聯合體占用記憶體的方式和上面不同,因為“共用一組記憶體單元”,也就是說它占用的大小為最大成員所占用的空間。如上面exa占用記憶體大小即為long所占用的空間大小。聯合體同時隻能放一個成員的值。當放c_data時占用第一個位元組,同理隻放s_data時占用前兩個位元組,隻放l_data時占用全部位元組。
聯合體也可以沒有名稱,叫做無名聯合體,隻是聲明一個成員項的集合,這些成員有相同的記憶體位址,可以用成員項的名字直接通路。如:
uninon
{
intI;
folatf;
}
在程式總可以直接用成員項i和f的名字通路i和f,比如 i=2; f=3.2;。無名聯合體一般是用作結構體的内嵌成員。
#include <iostream>
using namespace std;
union myun
{
int i;
struct {int j;int k;int l;}s;
}u;
int main()
{
u.s.j=2;
u.s.k=3;
u.s.l=4;
u.i=0;
cout<<u.s.j<<" "<<u.s.k<<" "<<u.s.l<<endl;
//輸出結果為0,3,4,這是因為聯合體共用記憶體,j的值被後面的i覆寫了
return 0;
}
4.類型定義語句—typedef
給已有的類型起一個别名,提高可讀性。
typedef 已有類型 新類型
如:
typedef int length;
typedef double width;
length a;
width b; //這樣定義提高了代碼的可讀性