C++編程語言中,有一種專門應對類型定義的用法,叫做C++ typedef。那麼我們應該如何正確理解這一應用呢?在這篇文章中,我們會通過C++ typedef不同使用方法來對這一應用進行詳細介紹。
C++ typedef,顧名思義,為“類型定義”,可以解釋為:將一種數據類型定義為某一個標識符,在程序中使用該標識符來實現相應數據類型變量的定義。例如:
- typedef unsigned int UINT;
- int main (int argc, char *argv[])
- {
- unsigned int a; // it’s OK
- UINT b; // it’s OK, a and b are of the same type (int)
- // . . . // code references the symbol a and b
- return 0;
- }
上面的代碼中,a和b屬於同一種數據類型unsigned int型),因為UINT標識符已經標示為unsigned int類型。上面的代碼看似簡單,相信很多讀者都用過這種方法,但這絕不是typedef的全部,下面介紹使用C++ typedef定義復雜數據類型的幾種用法。
1、定義結構體類型
結構體是一種較為常見的數據類型,在C/C++程序設計中使用的非常廣泛。下面的代碼就是結構體類型的一個應用:
- #include < iostream.h>
- int main (int argc, char *argv[])
- {
- struct {int x; int y;} point_a, point_b;
- point_a.x = 10; point_a.y = 10;
- point_b.x = 0; point_b.y = 0;
- ios::sync_with_stdio();
- cout < < point_a.x + point_a.y < < endl;
- cout < < point_b.x + point_b.y < < endl;
- return 0;
- }
上面的代碼包含了兩個結構體變量:point_a和point_b,它們的數據類型相同,都是struct {int x; int y;}類型。這種說法可能有點別扭,習慣上說point_a和point_b都是結構體類型,為什麼偏偏要說是struct {int x; int y;}類型呢?因為這種說法更加精確。比如在第一個例子中,對於“unsigned int a, b;”這條語句,我們可以說a和b都是整數類型,但更精確地說,它們應該是unsigned int類型。
既然struct {int x; int y;}是一種自定義的復雜數據類型,那麼如果我們要定義多個struct {int x; int y;}類型的變量,應該如何編寫代碼呢?其實很簡單,就當struct {int x; int y;}是一個簡單數據類型就可以了:
- struct {int x; int y;} var_1; // 定義了變量var_1
- struct {int x; int y;} array_1 [10]; // 定義了數組array_1
- struct {struct{int x; int y;} part1; int part2;} cplx;
上面的第三行定義了一個cplx變量,它的數據類型是一個復雜的結構體類型,有兩個成員:part1和part2。part1是struct {int x; int y;}類型的,part2是int類型的。
從上面的例子可以看出,如果在程序中需要多處定義struct {int x; int y;}類型的變量,就必須多次輸入“struct {int x; int y;}”這一類型名稱,況且,如果在結構體中有某個成員是struct {int x; int y;}類型的,還會使得定義變得非常繁雜而且容易出錯。為了輸入程序的方便,同時為了增強程序的可讀性,我們可以把struct {int x; int y;}這一數據類型定義為標識符“Point”,那麼上面的程序就會變得更容易理解:
- typedef struct {int x; int y;} Point;
- Point var_1; // 定義了變量var_1
- Point array_1 [10]; // 定義了數組array_1
- struct {Point part1; int part2;} cplx; // 定義了復雜類型變量cplx
需要說明的是,我們還可以使用下面的方法來定義結構體變量:
- struct t_Point {
- int x; int y;}; // 注意,這裡最後一個分號不能省略
- int main(int argc, char* argv[])
- {
- struct t_Point a, b;
- // . . .
- return 0;
- }
顯然,這種方法沒有C++ typedef更加直觀在C++中,main函數第一行的struct關鍵字可以省略,但在標准C中,省略該關鍵字會出現編譯錯誤)。
此外,對於定義鏈接隊列中的結點,我們可以這樣實現:
- typedef struct t_node {
- int Value;
- struct t_node *next;
- } Node;
- 當然也可以這樣定義:
- typedef strcut t_node Node;
- struct t_node {
- int Value;
- Node *next;
- };
2、定義數組類型
與定義結構體類型相似,可以使用C++ typedef來定義數組類型,例如:
- typedef int MyIntArray [100];
那麼程序中的
- MyIntArray ia;
就相當於
- int ia[100];
3、定義函數指針
看下面的代碼:
- typedef void (*FUNCADDR)(int)
此處FUNCADDR是指向這樣一個函數的指針,該函數的返回值為void類型,函數有一個int型的參數。再例如:
- void print (int x)
- {
- printf (“%d\n”, x);
- }
- int main (int argc, char *argv[])
- {
- FUNCADDR pFunc;
- pFunc = print; // 將指針指向print函數
- (*pFunc)(25); // 調用函數print
- return 0;
- }
函數指針一般用於回調函數、中斷處理過程的聲明,以及在面向對象程序設計中對事件處理過程的聲明。
4、定義類類型
類是面向對象程序設計語言中引入的一種新的數據類型,既然是數據類型,就可以使用C++ typedef對其進行定義:
- typedef class {
- private:
- int a;
- public:
- int b;
- } MyClass;
其實這和定義結構體類型非常相似,不過很少有人這麼使用。