類型別名
阿新 • • 發佈:2021-01-20
類型別名(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的指標。