午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

[C++語法] 關(guān)鍵字typedef用法(轉(zhuǎn))

 子路問學(xué) 2010-11-04

C/C++語言中的typedef相信大家已經(jīng)不陌生,本文對C/C++語言關(guān)鍵字typedef的各種用法作一個介紹。

typedef,顧名思義,為“類型定義”,可以解釋為:將一種數(shù)據(jù)類型定義為某一個標(biāo)識符,在程序中使用該標(biāo)識符來實現(xiàn)相應(yīng)數(shù)據(jù)類型變量的定義。例如:

 

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;

}

 

上面的代碼中,ab屬于同一種數(shù)據(jù)類型(unsigned int型),因為UINT標(biāo)識符已經(jīng)標(biāo)示為unsigned int類型。上面的代碼看似簡單,相信很多讀者都用過這種方法,但這絕不是typedef的全部,下面介紹使用typedef定義復(fù)雜數(shù)據(jù)類型的幾種用法。

 

1 定義結(jié)構(gòu)體類型

結(jié)構(gòu)體是一種較為常見的數(shù)據(jù)類型,在C/C++程序設(shè)計中使用的非常廣泛。下面的代碼就是結(jié)構(gòu)體類型的一個應(yīng)用:

#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;

}

上面的代碼包含了兩個結(jié)構(gòu)體變量:point_apoint_b,它們的數(shù)據(jù)類型相同,都是struct {int x; int y;}類型。這種說法可能有點別扭,習(xí)慣上說point_apoint_b都是結(jié)構(gòu)體類型,為什么偏偏要說是struct {int x; int y;}類型呢?因為這種說法更加精確。比如在第一個例子中,對于“unsigned int a, b;”這條語句,我們可以說ab都是整數(shù)類型,但更精確地說,它們應(yīng)該是unsigned int類型。

既然struct {int x; int y;}是一種自定義的復(fù)雜數(shù)據(jù)類型,那么如果我們要定義多個struct {int x; int y;}類型的變量,應(yīng)該如何編寫代碼呢?其實很簡單,就當(dāng)struct {int x; int y;}是一個簡單數(shù)據(jù)類型就可以了:

struct {int x; int y;} var_1;   // 定義了變量var_1

struct {int x; int y;} array_1 [10];    // 定義了數(shù)組array_1

struct {struct{int x; int y;} part1; int part2;} cplx;

上面的第三行定義了一個cplx變量,它的數(shù)據(jù)類型是一個復(fù)雜的結(jié)構(gòu)體類型,有兩個成員:part1part2。part1struct {int x; int y;}類型的,part2int類型的。

從上面的例子可以看出,如果在程序中需要多處定義struct {int x; int y;}類型的變量,就必須多次輸入“struct {int x; int y;}”這一類型名稱,況且,如果在結(jié)構(gòu)體中有某個成員是struct {int x; int y;}類型的,還會使得定義變得非常繁雜而且容易出錯。為了輸入程序的方便,同時為了增強程序的可讀性,我們可以把struct {int x; int y;}這一數(shù)據(jù)類型定義為標(biāo)識符“Point”,那么上面的程序就會變得更容易理解:

typedef struct {int x; int y;} Point;

Point var_1; // 定義了變量var_1

Point array_1 [10]; // 定義了數(shù)組array_1

struct {Point part1; int part2;} cplx; // 定義了復(fù)雜類型變量cplx

需要說明的是,我們還可以使用下面的方法來定義結(jié)構(gòu)體變量:

struct t_Point {

    int x; int y;};    // 注意,這里最后一個分號不能省略

 

int main(int argc, char* argv[])

{

    struct t_Point a, b;

    // . . .

    return 0;

}

顯然,這種方法沒有typedef更加直觀(在C++中,main函數(shù)第一行的struct關(guān)鍵字可以省略,但在標(biāo)準(zhǔn)C中,省略該關(guān)鍵字會出現(xiàn)編譯錯誤)。

此外,對于定義鏈接隊列中的結(jié)點,我們可以這樣實現(xiàn):

typedef struct t_node {

    int Value;

    struct t_node *next;

} Node;

當(dāng)然也可以這樣定義:

typedef strcut t_node Node;

struct t_node {

    int Value;

    Node *next;

};

 

2、定義數(shù)組類型

與定義結(jié)構(gòu)體類型相似,可以使用typedef來定義數(shù)組類型,例如:

typedef int MyIntArray [100];

那么程序中的

MyIntArray ia;

就相當(dāng)于

int ia[100];

3、 定義函數(shù)指針

看下面的代碼:

typedef void (*FUNCADDR)(int)

此處FUNCADDR是指向這樣一個函數(shù)的指針,該函數(shù)的返回值為void類型,函數(shù)有一個int型的參數(shù)。再例如:

void print (int x)

{

    printf (“%d\n”, x);

}

int main (int argc, char *argv[])

{

    FUNCADDR pFunc;

    pFunc = print;  // 將指針指向print函數(shù)

    (*pFunc)(25);       // 調(diào)用函數(shù)print

    return 0;

}

函數(shù)指針一般用于回調(diào)函數(shù)、中斷處理過程的聲明,以及在面向?qū)ο蟪绦蛟O(shè)計中對事件處理過程的聲明。

4、 定義類類型

類是面向?qū)ο蟪绦蛟O(shè)計語言中引入的一種新的數(shù)據(jù)類型,既然是數(shù)據(jù)類型,就可以使用typedef對其進行定義:

typedef class {

    private:

        int a;

    public:

        int b;

} MyClass;

其實這和定義結(jié)構(gòu)體類型非常相似,不過很少有人這么使用。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多