(轉)[C++語法] 關鍵字typedef用法

轉自http://www.cnblogs.com/SweetDream/archive/2006/05/10/395921.htmlhtml

  C/C++語言中的typedef相信你們已經不陌生,本文對C/C++語言關鍵字typedef的各類用法做一個介紹。node

  typedef,顧名思義,爲「類型定義」,能夠解釋爲:將一種數據類型定義爲某一個標識符,在程序中使用該標識符來實現相應數據類型變量的定義。例如:ios

 

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

    // . . .    // code references the symbol a and bhtm

    return 0;對象

}

 

  上面的代碼中,a和b屬於同一種數據類型(unsigned int型),由於UINT標識符已經標示爲unsigned int類型。上面的代碼看似簡單,相信不少讀者都用過這種方法,但這毫不是typedef的所有,下面介紹使用typedef定義複雜數據類型的幾種用法。

 

一、 定義結構體類型

結構體是一種較爲常見的數據類型,在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;

}

  顯然,這種方法沒有typedef更加直觀(在C++中,main函數第一行的struct關鍵字能夠省略,但在標準C中,省略該關鍵字會出現編譯錯誤)。

  此外,對於定義連接隊列中的結點,咱們能夠這樣實現:

typedef struct t_node {

    int Value;

    struct t_node *next;

} Node;

 固然也能夠這樣定義:

typedef struct t_node Node;

struct t_node {

    int Value;

    Node *next;

};

 

二、定義數組類型

  與定義結構體類型類似,可使用typedef來定義數組類型,例如:

  typedef int MyIntArray [100];

  那麼程序中的

  MyIntArray ia;

  就至關於

  int ia[100];

三、 定義函數指針

  看下面的代碼:

  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;

}

  函數指針通常用於回調函數、中斷處理過程的聲明,以及在面向對象程序設計中對事件處理過程的聲明。

四、 定義類類型

  類是面向對象程序設計語言中引入的一種新的數據類型,既然是數據類型,就可使用typedef對其進行定義:

typedef class {

    private:

        int a;

    public:

        int b;

} MyClass;

  其實這和定義結構體類型很是類似,不過不多有人這麼使用。

相關文章
相關標籤/搜索