1. 程式人生 > 實用技巧 >類型別名

類型別名

類型別名(type alias)是一個名字,它是某種型別的同義詞。使用類型別名有很多好處,它讓複雜的型別名字變得簡單明瞭、易於理解和使用,還有助於程式設計師清楚地知道使用該型別的真實目的。

typedef double wages;      // wages是double的同義詞
typedef wages base, *p;    // base是double的同義詞,p是double*的同義詞

其中,關鍵字typedef作為宣告語句中的基本資料型別的一部分出現。含有 typedef 的宣告語句定義的不再是變數而是類型別名。

和以前的宣告語句一樣,這裡的宣告符也可以包含型別修飾,從而也能由基本資料型別構造出複合型別來。
新標準規定了一種新的方法,使用別名宣告(alias declaration)來定義型別的別名∶

using SI = Sales_item;     // SI是Sales_item的同義詞

這種方法用關鍵字 using 作為別名宣告的開始,其後緊跟別名和等號,其作用是把等號左側的名字規定成等號右側型別的別名。

wages hourly, weekly;      // 等價於double hourly, weekly;
SI item;                   // 等價於Sales_item item;

指標、常量和類型別名

如果某個類型別名指代的是複合型別或常量,那麼把它用到宣告語句裡就會產生意想不到的後果。

例如下面的宣告語句用到了型別 pstring,它實際上是型別 char*的別名∶

typedef char *pstring;
const pstring cstr = 0;    // cstr是指向char的常量指標
const pstring *ps;         // ps是一個指標,它的物件是指向char的常量指標

上述兩條宣告語句的基本資料型別都是const pstring,和過去一樣,const是對給定型別的修飾。

pstring 實際上是指向 char的指標,因此,const pstring就是指向 char 的常量指標,而非指向常量字元的指標。

遇到一條使用了類型別名的宣告語句時,人們往往會錯誤地嘗試把類型別名替換成它本來的樣子,以理解該語句的含義∶

const char *cstr = 0;      // 是對const pstring cstr的誤解

這種理解是錯誤的。宣告語句中用到pstring時,其基本資料型別是指標。可是用 char* 重寫了宣告語句後,資料型別就變成了 char,*成為了宣告符的一部分。

這樣改寫的結果是,const char 成了基本資料型別。前後兩種宣告含義截然不同,前者聲明瞭一個指向char的常量指標,改寫後的形式則聲明瞭一個指向const char的指標。