C++類型別名(typedef和using)
前言
隨著程式越來越複雜,程式中用到的型別也越來越複雜,這種複雜性有兩方面:
(1)一些型別難以“拼寫”,它們的名字既難記住用容易出錯,還無法明確體現其真實目的和含義;
(2)有時候根本搞不清楚到底需要什麼型別,程式設計師不得不回頭從程式的上下文尋求幫助。
這裡主要針對(1)來分析。
類型別名(type alias)是一個名字,它是某種型別的同義詞。可以是複雜的名字更簡單、易懂,也讓使用者知道該型別的使用目的。
有兩種方法可以定義類型別名。傳統的方法是使用關鍵字typedef。
typedef
typedef double wages; //wages是double的同義詞
typedef wages base, *p; //base是double的同義詞,p是double*的同義詞
注意上面都是語句,結尾有分號。
typedef還有個常用的地方就是函式指標
1 #include<iostream> 2 3 typedef int (*pFun)(); 4 5 int display() 6 { 7 std::cout << "function pointer!" << std::endl; 8 return 0; 9 } 10 11 int main() 12 { 13 pFun p = display; 14 (*p)(); 15 return 0; 16 }
using
C++11規定了一種新的方法,使用別名宣告來定義型別的別名:
using SI = Sales; //Sales是一個類,SI是Sales的同義詞
(注意,using還有很多別的用法)
指標、常量和類型別名
如果某個類型別名指代的是複合型別或常量,那麼把它用到宣告語句裡就會產生意想不到的後果。
例如下面的宣告語句用到了型別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成為了基本型別。這兩者的含義完全不一樣,正確理解是頂層const,而錯誤理解是底層const。