1. 程式人生 > >C++類型別名(typedef和using)

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。