typedef是替一個對象取一個別名,以此增強程序的可讀性。
1 定義一種數據類型的別名
typedef int INT; //定義int類型的一個別名INT。注意:末尾的分號
typedef char* pStr;
2 定義結構體的別名(很久遠的事情了,現在C++已經不存在這個問題)
struct sPositon //結構體定義
{
int x;
int y;
};
struct sPositon p; //定義變量
如上所示,定義變量時還是加struct關鍵字,比較繁瑣。
typedef struct sPosition //定義結構體
{
int x;
int y;
}POINT;
POINT p; //定義結構體變量
如上所示,省去了struct關鍵字,但是這個在C++中已經不需要了。
3 定義與平臺無關的類型
如某一平臺支持int類型,但不支持long類型。則可以使用typedef定義一個支持類型的別名,程序中使用該別名聲明變量。
這樣跨平臺時,我們只使用極小的代價。標準庫中廣泛使用。
4 爲複雜的聲明定義一個簡單的別名
例如函數指針:typedef int (*SUM) (int, int)。SUM是定義的別名,表示的是一個指向函數的指針,該函數有兩個int類型的參數,返回一個int類型的值。
則SUM類型的對象可以指向任何符合上述規則的函數。例如:
#include<iostream>
using namespace std;
typedef int (*SUM)(int,int);
int fun0(int a,int b);
int fun1(int a,int b);
int main()
{
A a;
a = fun0;
a(1,2);
a = fun1;
a(4,5);
return 0;
}
int fun0(int a,int b)
{
cout<<a+b<<endl;
return a+b;
}
int fun1(int a,int b)
{
cout<<a+b<<endl;
return 0;
}
5 typedef需要注意的事項-常量指針
例如:
typedef char* pStr;
const char* p1 = "cui";
const pStr p2 = "cui";
p1++; //正常
p2++; //編譯報錯
p1和p2都是常量指針,即指針指向的內容不能修改,而指針所指地址是可以修改的。
p1++,不用解釋,因爲常量指針是可變的。
p2是我們定義的別名,而不是系統固有類型,編譯器在編譯時,會認爲p2是常量,不可修改,所以p2++會報錯。