天天看點

八、自定義資料類型

當内置基本資料類型不能滿足需求時,就需要自定義資料類型。主要有:枚舉類型、結構類型、聯合類型、數組類型和類。
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;  //這樣定義提高了代碼的可讀性