天天看點

C++ typedef用法

typedef的文法描述:

在現實生活中,資訊的概念可能是長度,數量和面積等。在C++語言中,資訊被抽象為int、float和 double等基本資料類型。從基本資料類型名稱上,不能夠看出其所代表的實體屬性,并且int、float和double為系統關鍵字,不可以修改。為了解決使用者自定義資料類型名稱的需求,C++語言中引入類型重定義語句typedef,可以為資料類型定義新的類型名稱,進而豐富資料類型所包含的屬性資訊。

typedef的定義

typedef 類型名稱類型辨別符;      如 typedef  int  LENGTH;

可使用LENGTH 定義變量;       如 LENGTH   c;

typedef 的主要應用形式:

1、  為基本資料類型定義新的類型名、定義與平台無關的類型。舉例如上

2、 為自定義資料類型(結構體、公用體和枚舉類型)定義簡潔的類型名稱。

舉例:typedef struct { int x;}Point;   可用Point 來聲明結構體;

3、  為數組定義簡潔的類型名稱。

舉例:typedef int array_10 [10];  可使用 array_10 a;a為int數組,10個元素

4、 為指針定義簡潔的名稱//普通指針、函數指針

typedef int(*MyFun)(int a,int b); 可使用MyFun聲明函數指針、MyFun p;

int Max(int a,int b);   p=Max;

5、  為複雜聲明定義新的簡單别名。

舉例1:原始:int *(*a[5])(int ,char*); 變量名為a;

        使用typedef int *(*p)(int ,char*);     p a[5]即可

舉例2:原始:void (*b[10])(void (*)()); 分兩步替換即可。先替換右側括号中的。

                   typedefvoid(*pFun1)();  

                   typedefvoid(*pFun2)(pFun1);            pFun2  b[10]即可

舉例3:原始:double (*)()(*e)[9];  分兩步替換即可。

typedef double(*p);

typedef p(*pFun1)[9];                                 pFun1 e;即可

了解複雜聲明可用的“右左法則”;從變量名看起,先往右,再往左,碰到一個圓括号就    調整閱讀的方向,括号内分析完就跳出括号,依然先右後左的順序,如此循環到結束。

舉例:int (*func[5])(int *); func 右邊是一個[]運算符,表明func是具有5個元素的數          組,左邊有* ,表明func的元素是指針,[]運算符優先級比*高,func先跟[]結合).

Func數組的元素是函數類型的指針,它指向的函數具有int *類型的形參。

兩個模式:

typedef (*)(…) 函數指針

typedef (*)[]  數組指針

在c++類中使用函數指針:

typedef 傳回類型(類名::*新類型)(參數表);使用類成員函數必須有”->*”或者“.*”

需要注意的問題:

1、  typedef不建立新類型,隻是為已有類型建立一個新名稱。

2、 它隻适用于類型名稱定義,不适應于變量定義。

3、  與#define可達到相同效果,但實質不同。#define主要定義常量,此常量可以為任何的字元及其組合,在編譯之前,将此常量出現的所有位置,用其代表的字元或字元組合無條件的替換,然後進行編譯。typedef是為已知資料類型增加一個新名稱,其原理與使用int 、double等保留字一緻。

typedef和define具體的詳細差別:

1、#define是預處理指令,在編譯預處理時進行簡單的替換,不作正确性檢查,不關含義是否正确照樣帶入,隻有在編譯已被展開的源程式時才會發現可能的錯誤并報錯。例如: #define PI 3.1415926 程式中的:area=PI*r*r 會替換為3.1415926*r*r 如果你把#define語句中的數字9 寫成字母g 預處理也照樣帶入。

         2、typedef是在編譯時處理的。它在自己的作用域内給一個已經存在的類型一個别名。

3、typedef int * int_ptr與 #define int_ptr int * 作用都是用int_ptr代表 int * ,但是二者不同,正如前面所說,#define在預處理時進行簡單的替換,而typedef不是簡單替換,而是采用如同定義變量的方法那樣來聲明一種類型。舉例:t

ypedef int* pint;

#definePINT int*    

const  pint p;//p不可更改。但p指向的内容可更改。

const PINTp;//p可更改,但是p指向的内容不可更改。

陷阱:

1、typedef是定義了一種類型的新别名,不同于宏,它不是簡單的字元串替換。

typedef char *PSTR;   int fun(const PSTR,const PSTR);

const PSTR 不是const  char *;  而是  char * const;

2、typedef在文法上是一個存儲類的關鍵字(如auto、extern、mutable、static、register等一樣),雖然它并不真正影響對象的存儲特性,如typedef static int INT2;//不可行

繼續閱讀