C++ - 用戶自定義數(shù)據(jù)類型

C++允許用戶根據(jù)需要自己聲明一些類型,包括數(shù)組、結(jié)構(gòu)體類型钮热、共用體類型、枚舉類型烛芬、類類型

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

在一個(gè)組合項(xiàng)中包含若干個(gè)類型不同的數(shù)據(jù)項(xiàng)隧期,C/C++允許用戶自己指定這樣一種數(shù)據(jù)類型飒责,成為結(jié)構(gòu)體

比如聲明一個(gè)Student結(jié)構(gòu)體類型

struct Student  // 聲明一個(gè)Student結(jié)構(gòu)體類型
{
    int num; 
    char name[20];
    char sex;
    int age;
    float score;
    char address[30];
}; //最后有一個(gè)分號

struct是聲明結(jié)構(gòu)體類型時(shí)所必須的關(guān)鍵字,它向編譯系統(tǒng)聲明:這是一種結(jié)構(gòu)體類型仆潮,它包括num宏蛉、name、sex性置、age拾并、score、address等不同類型的數(shù)據(jù)項(xiàng)

聲明一個(gè)結(jié)構(gòu)體類型的一般形式為:

struct type_name { //type_name表示結(jié)構(gòu)體類型名
    member_type1 member_name1; // member_type1成員類型 member_name1成員名
    member_type2 member_name2;
    member_type3 member_name3;
    ...
} object_names;
  • type_name 是結(jié)構(gòu)體類型的名稱鹏浅;
  • member_type1 member_name1 是標(biāo)準(zhǔn)的變量定義嗅义,比如 int i; 或者 float f; 或者其他有效的變量定義;
  • 在結(jié)構(gòu)定義的末尾隐砸,最后一個(gè)分號之前之碗,可以指定一個(gè)或多個(gè)結(jié)構(gòu)變量,這是可選的季希。
結(jié)構(gòu)體類型變量的定義方法極其初始化

前面只是指定了一種結(jié)構(gòu)體類型继控,它相當(dāng)于一個(gè)模型,但其中并無具體數(shù)據(jù)胖眷,系統(tǒng)對之也不分配實(shí)際內(nèi)存單元。為了能在程序中使用結(jié)構(gòu)體類型的數(shù)據(jù)霹崎,應(yīng)當(dāng)定義結(jié)構(gòu)體類型的變量珊搀,并在其中存放具體的數(shù)據(jù)。

定義結(jié)構(gòu)體類型變量的方法

可以采取以下3種方法定義結(jié)構(gòu)體類型變量

1尾菇、先聲明結(jié)構(gòu)體類型再定義變量

如上面已經(jīng)定義了一個(gè)結(jié)構(gòu)體類型Student境析,可以用它來定義結(jié)構(gòu)體變量。如:

Student student1, student2; //Student 結(jié)構(gòu)體類型名派诬,student1, student2結(jié)構(gòu)體變量名

C語言中劳淆,在定義結(jié)構(gòu)體變量時(shí),要在結(jié)構(gòu)體類型名前面加上關(guān)鍵字struct默赂,C++保留了C的用法沛鸵,如下:

struct Student student1, student2;

但是C++提出來新的方法,可以不必在定義結(jié)構(gòu)體變量時(shí)加上struct關(guān)鍵詞缆八,所以建議省略struct曲掰,這樣使用更加方便,簡單奈辰。

在定義了結(jié)構(gòu)體變量后栏妖,系統(tǒng)會(huì)為之分配內(nèi)存單元,student1student2在內(nèi)存中各占63個(gè)字節(jié)(4+20+1+4+4+30=63)

2奖恰、在聲明類型的同時(shí)定義變量

struct Student  // 聲明一個(gè)Student結(jié)構(gòu)體類型
{
    int num;
    char name[20];
    char sex;
    int age;
    float score;
    char address[30];
} student1, student2; //定義兩個(gè)結(jié)構(gòu)體類型Student的變量student1, student2

這種形式的定義的一般形式為:

struct 結(jié)構(gòu)體類型名
{
   成員表
} 變量名表;

3吊趾、直接定義結(jié)構(gòu)體類型變量宛裕,其一般形式如下

struct     // 注意沒有結(jié)構(gòu)體類型名
{
   成員表
} 變量名表;

這種方法雖然合法,但是很少使用论泛。建議先定義類型后定義變量的第一種方法揩尸,將聲明結(jié)構(gòu)體類型和定義結(jié)構(gòu)體變量分開,便于不同的函數(shù)甚至不同的文件都能使用所聲明的結(jié)構(gòu)體類型孵奶。

若程序規(guī)模比較大疲酌,往往將若干個(gè)結(jié)構(gòu)體類型的聲明幾種放到一個(gè)頭文件中,如果哪個(gè)源文件需要用到此結(jié)構(gòu)體類型了袁,則用#include指令將該文件包含到本文件中朗恳。這樣做便于修改和使用。在程序叫簡單载绿,結(jié)構(gòu)體類型只在本文件中使用粥诫,也可以使用第二種方法

關(guān)于結(jié)構(gòu)體,說明幾點(diǎn):

  • 結(jié)構(gòu)體類型的結(jié)構(gòu)根據(jù)需要進(jìn)行設(shè)計(jì)崭庸,可以設(shè)計(jì)出多種不同的結(jié)構(gòu)體類型怀浆。

  • 類型與變量是不同的概念,不要混淆怕享。只能對結(jié)構(gòu)體變量中的成員賦值执赡,而不能對結(jié)構(gòu)體類型賦值。在編譯時(shí)函筋,對類型是不分配空間的沙合,只對變量分配空間

  • 對結(jié)構(gòu)體中的成員可以單獨(dú)使用,它的作用與地位相當(dāng)于普通變量

  • 成員也可以是結(jié)構(gòu)體變量跌帐,如:

struct Date // 聲明一個(gè)結(jié)構(gòu)體類型Date
{
    int year;
    int month;
    int day;
};

struct Student  // 聲明一個(gè)Student結(jié)構(gòu)體類型
{
    int num;
    char name[20];
    char sex;
    int age;
    float score;
    char address[30];
    Date birthday; // Date是結(jié)構(gòu)體類型首懈,birthday是Date類型的成員
} student1, student2; //定義兩個(gè)結(jié)構(gòu)體類型Student的變量student1, student2
結(jié)構(gòu)體變量的初始化
  • 和其他類型變量一樣,對結(jié)構(gòu)體變量可以在定義時(shí)指定初始值谨敛。如:
struct Student  // 聲明一個(gè)Student結(jié)構(gòu)體類型
{
    int num;
    char name[20];
    char sex;
    int age;
    float score;
    char address[30];
} student1 = { 10001, "Zhang", 'M', 21, 92, "Shanghai"}; 
  • 也可以采用類型與定義變量分開的形式究履,在定義變量時(shí)進(jìn)行初始化
Student student2 = { 10002, "Wang", 'F', 23, 88, "Shanghai"};

引用結(jié)構(gòu)體變量

在定義結(jié)構(gòu)體變量之后,當(dāng)然可以引用這個(gè)變量脸狸。

1)可以將一個(gè)結(jié)構(gòu)體變量的只賦給另一個(gè)具有系統(tǒng)結(jié)構(gòu)的結(jié)構(gòu)體變量最仑。如上面的student1student2都是Student類型的變量,可以互相賦值

student1 = student2;

賦值時(shí)肥惭,結(jié)構(gòu)體變量student2中的各個(gè)成員的值分別賦給結(jié)構(gòu)體變量student1中相應(yīng)的成員

2)可以引用一個(gè)結(jié)構(gòu)體變量中的一個(gè)成員的值盯仪。例如:student1.num表示結(jié)構(gòu)體變量student1中的成員num的值,引用結(jié)構(gòu)體變量中成員的一般形式為:

student1.num = 10010;

.是成員運(yùn)算符蜜葱,它在所有的運(yùn)算符中優(yōu)先級最高全景,因此可以把student1.num作為一個(gè)整體來看待。上面的賦值語句的作用是將整數(shù)10010賦值給student1變量中的整型成員num牵囤。

3)如果成員本身也是一個(gè)結(jié)構(gòu)體類型爸黄,則要用若干個(gè)成員運(yùn)算符滞伟,一級一級地找到最低一級的成員。例如炕贵,已定義結(jié)構(gòu)體變量student1梆奈,如果想引用student1變量中的birthday成員中的month成員,則需要逐級引用

student1.birthday.month //表示引用結(jié)構(gòu)體變量student1中的birthday成員中的month成員

4)不能將一個(gè)結(jié)構(gòu)體變量作為一個(gè)整體進(jìn)行輸入和輸出称开。即不能進(jìn)行如下操作:

cout<<student1; // 錯(cuò)誤使用

只能對結(jié)構(gòu)體變量中的各個(gè)成員分別進(jìn)行輸入和輸出

cout<<student1.age;

5)對結(jié)構(gòu)體變量的成員可以像普通變量一樣進(jìn)行有關(guān)運(yùn)算亩钟。例如:

student2.score = student1.score;
student1.age++;

6)可以引用結(jié)構(gòu)體變量成員的低下,也可以引用結(jié)構(gòu)體變量的地址

cout<<&student1;     // 輸出結(jié)構(gòu)體變量student1的起始地址
cout<<&student1.age; // 輸出student1.age的地址

結(jié)構(gòu)體數(shù)組

一個(gè)結(jié)構(gòu)體變量中可以存放一組數(shù)據(jù)(如一個(gè)學(xué)生的學(xué)號鳖轰、姓名清酥、成績等數(shù)據(jù))。如果有10個(gè)學(xué)生的數(shù)據(jù)需要參加運(yùn)算蕴侣,顯然應(yīng)該使用數(shù)組焰轻,這就是結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組與數(shù)值型數(shù)組不同之處在于:每個(gè)數(shù)組元素都是一個(gè)結(jié)構(gòu)體類型的數(shù)據(jù)昆雀,它們都分別包括各個(gè)成員項(xiàng)

定義結(jié)構(gòu)體數(shù)組

和定義結(jié)構(gòu)體變量的方法相似辱志,只須指出其為數(shù)組即可。如

struct Student  // 聲明一個(gè)Student結(jié)構(gòu)體類型
{
    int num;
    char name[20];
    char sex;
    int age;
    float score;
    char address[30];
};

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

    Student stu[3]; // 定義Student類型的數(shù)組
    return 0;
}

或者直接定義結(jié)構(gòu)數(shù)據(jù)

struct Student  // 聲明一個(gè)Student結(jié)構(gòu)體類型
{
    int num;
    char name[20];
    char sex;
    int age;
    float score;
    char address[30];
}stu[3];

或者

struct   // 聲明一個(gè)Student結(jié)構(gòu)體類型
{
    int num;
    char name[20];
    char sex;
    int age;
    float score;
    char address[30];
}stu[3];
結(jié)構(gòu)體數(shù)組的初始化

與其他類型的數(shù)組一樣狞膘,對結(jié)構(gòu)體數(shù)組可以初始化揩懒,如:

struct  Student // 聲明一個(gè)Student結(jié)構(gòu)體類型
{
    int num;
    char name[20];
    char sex;
    int age;
    float score;
    char address[30];
} stu[3] = { {10101, "Li", 'M', 19, 88, "Shanghai"},
    {10102, "Wang", 'F', 18, 85, "Shanghai"},
    {10103, "Zhang", 'M', 17, 83, "Shanghai"} };

一個(gè)結(jié)構(gòu)體常量應(yīng)包含結(jié)構(gòu)體中全部成員的值,以上是把聲明結(jié)構(gòu)體類型和定義結(jié)構(gòu)體數(shù)組以及數(shù)組的初始化同時(shí)完成了挽封。定義數(shù)組stu時(shí)也可以不指定元素格式旭从,下成以下形式

 stu[] = { {...}, {...}, {...}};

編譯時(shí),系統(tǒng)會(huì)根據(jù)給出初值的結(jié)構(gòu)體常量的個(gè)數(shù)來確定數(shù)組元素的個(gè)數(shù)场仲,上面外層括號中有3個(gè)大括號,提供了3組初始值退疫,系統(tǒng)會(huì)把stu數(shù)組的元素個(gè)數(shù)定為3.

當(dāng)然渠缕,聲明結(jié)構(gòu)體類型和定義結(jié)構(gòu)體數(shù)組及初始化也可以分開進(jìn)行

 Student  stu[] = { {...}, {...}, {...}};

指向結(jié)構(gòu)體變量的指針

一個(gè)結(jié)構(gòu)體變量的指針就是該變量所占據(jù)的內(nèi)存段的起始地址“保可以設(shè)一個(gè)指針變量亦鳞,用來指向一個(gè)結(jié)構(gòu)體變量,此時(shí)該指針變量的值是結(jié)構(gòu)體變量的起始地址棒坏。指針變量也可以用來指向結(jié)構(gòu)體數(shù)組中的元素

1燕差、通過指向結(jié)構(gòu)體變量的指針引用結(jié)構(gòu)體變量中的成員

看一個(gè)簡單的例子來說明指向結(jié)構(gòu)體變量的指針變量的應(yīng)用

定義一個(gè)結(jié)構(gòu)體變量stu,成員包括學(xué)號坝冕、姓名徒探、性別、成績喂窟。定義一個(gè)指針變量p指向該結(jié)構(gòu)體變量stu测暗,通過指針變量輸出各成員的值

#include <iostream>
#include <string>
using namespace std;

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

    struct  Student
    {
        int num;
        string name;
        char sex;
        float score;
    };

    Student stu;
    Student *p = &stu;
    stu.num = 10001;
    stu.name = "wang";
    stu.sex = 'f';
    stu.score = 90;

    cout<<stu.num<<" "<<stu.name<<" "<<stu.sex<< " "<<stu.score<<endl;
    cout<<(*p).num<<" "<<(*p).name<<" "<<(*p).sex<< " "<<(*p).score<<endl;
    cout<<p->num<<" "<<p->name<<" "<<p->sex<< " "<<p->score<<endl;

    return 0;
}

在主函數(shù)中聲明了Student類型央串,然后定義一個(gè)Student類型的變量stu。同時(shí)又定義一個(gè)指針變量p碗啄,它指向一個(gè)Student類型的數(shù)據(jù)质和。將結(jié)構(gòu)體變量stu的起始地址賦給指針變量p,也就是使p指向stu稚字,然后對stu中的各個(gè)成員賦值饲宿。

第一個(gè)cout語句的作用是輸出stu的各個(gè)成員,用stu.num表示胆描,其余類推

第二個(gè)cout語句使用(*p)輸出stu各成員的值瘫想,(*p)表示p指向的結(jié)構(gòu)體變量,(*p).num是p指向的結(jié)構(gòu)體變量中的成員num袄友,即stu.num殿托。注意,*p兩側(cè)的括號不能省略剧蚣,因?yàn)槌蓡T運(yùn)算符.優(yōu)于*運(yùn)算符

第三個(gè)cout語句是使用->運(yùn)算符支竹,形象的表示指向的關(guān)系。p->num表示指針p當(dāng)前指向的結(jié)構(gòu)體變量中的成員num鸠按,等價(jià)于(*p).num

也就是說以下3種形式等價(jià)

  • 結(jié)構(gòu)體變量.成員名礼搁,如:stu.num
  • (*p).成員名,如:(*p).num
  • p->成員名目尖,如:p->num

2馒吴、用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體變量的指針構(gòu)成鏈表

鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)

結(jié)構(gòu)體類型數(shù)據(jù)作為函數(shù)參數(shù)

將一個(gè)結(jié)構(gòu)體變量中的數(shù)據(jù)傳遞給另一個(gè)函數(shù),有以下3種方法

1)用結(jié)構(gòu)體變量名作為參數(shù)

例如瑟曲,用結(jié)構(gòu)體變量stu做參數(shù)實(shí)參饮戳,將實(shí)參值傳給形參。用結(jié)構(gòu)體變量做實(shí)參洞拨,采取的是“值傳遞”的方式扯罐,將結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)容全部順序傳遞給形參。形參也必須是同類型的結(jié)構(gòu)體變量烦衣,在函數(shù)調(diào)用期間形參也占內(nèi)存單元歹河。這種傳遞方式在空間和時(shí)間上開銷較大,如果結(jié)構(gòu)體的規(guī)模很大時(shí)花吟,開銷是很重要的秸歧。此外,由于采用值傳遞方式衅澈,如果在執(zhí)行被調(diào)用函數(shù)期間改變了形參的值键菱,該值不能返回主調(diào)函數(shù),這往往不能滿足需求今布。因此一般很少使用

#include <iostream>
#include <string>
using namespace std;

struct  Student
{
    int num;
    string name;
};

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

    void print(Student);

    Student stu;
    stu.num = 10001;
    stu.name = "wang";
    print(stu);

    return 0;
}

void print(Student stu)
{
    cout<<stu.num<<" "<<stu.name<<endl;
}

2)用結(jié)構(gòu)體變量的指針做實(shí)參纱耻,將結(jié)構(gòu)體變量的地址傳給形參

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

    void print(Student *);

    Student stu;
    Student *P= &stu;
    stu.num = 10001;
    stu.name = "wang";
    print(P);

    return 0;
}

void print(Student *stu)
{
    cout<<stu->num<<" "<<stu->name<<endl;
}

3)用結(jié)構(gòu)體變量的引用做函數(shù)參數(shù)芭梯,它就成為實(shí)參(是結(jié)構(gòu)體變量)的別名

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

    void print(Student &);

    Student stu;
    stu.num = 10001;
    stu.name = "wang";
    print(stu);

    return 0;
}


void print(Student &stu)
{
    cout<<stu.num<<" "<<stu.name<<endl;
}

3種方法的比較:

程序(1)用結(jié)構(gòu)體變量做實(shí)參和形參,程序直觀易懂弄喘,但是在調(diào)用函數(shù)實(shí)要單獨(dú)開辟內(nèi)存單元玖喘,實(shí)參中全部內(nèi)容通過值傳遞方式一一傳遞給形參,如果結(jié)構(gòu)體變量占的存儲(chǔ)空間很大蘑志,則在虛實(shí)結(jié)合時(shí)空間和時(shí)間的開銷都比較大累奈,效率不高

程序(2)采用指針變量做實(shí)參和形參,在調(diào)用函數(shù)時(shí)形參只占4個(gè)字節(jié)急但,時(shí)參只是將stu的起始地址傳給形參澎媒,而不是將結(jié)構(gòu)體變量的各成員的值一一傳給形參,因而空間和時(shí)間都開銷很小波桩,效率較高戒努。

線程(3)的實(shí)參是結(jié)構(gòu)體Student類型變量,而形參用Student類型的引用镐躲,虛實(shí)結(jié)合時(shí)傳遞的是stu的地址储玫,因而效率高。

用new和delete運(yùn)算符進(jìn)行動(dòng)態(tài)分配和撤銷存儲(chǔ)空間

在軟件開發(fā)中萤皂,常常需要?jiǎng)討B(tài)地分配和撤銷內(nèi)存空間撒穷,例如:對動(dòng)態(tài)鏈表中結(jié)點(diǎn)的插入與刪除。在C語言是利用庫函數(shù)mallocfree來分配和撤銷內(nèi)存空間裆熙。C++提供了較簡單功能較強(qiáng)的運(yùn)算符newdelete來取代mallocfree函數(shù)

注意:new和delete是運(yùn)算符不是函數(shù)端礼,因此執(zhí)行效率高.雖然為了與 C兼容,C++仍然保留了malloc和free函數(shù)入录,但建議不用malloc和free函數(shù)蛤奥,而用new和delete是運(yùn)算符

new運(yùn)算符

new int; // 開辟一個(gè)存放整數(shù)的存儲(chǔ)空間,返回一個(gè)指向該存儲(chǔ)空間的地址(即指針)
new int(100); // 開辟存放一個(gè)整數(shù)的空間僚稿,并指定該整數(shù)的初值為100喻括,返回一個(gè)指向該存儲(chǔ)空間的地址
new char[10]; // 開辟一個(gè)存放字符數(shù)組(包括10個(gè)元素)的空間,返回字符數(shù)組首元素的地址
new char[5][4]; // 開辟一個(gè)存放二維數(shù)組(大小為5*4)的空間贫奠,返回首元素地址
float *p = new float(3.14159); // 開辟一個(gè)存放單精度數(shù)的空間,并指定該數(shù)的初值為3.14159望蜡,將返回的該空間的地址賦給指針變量p

new運(yùn)算符使用的一般格式為

new 類型 [初值]

注意:用new分配數(shù)組空間時(shí)不能指定初值唤崭。如果由于內(nèi)存不足等原因無法正常分配空間,則new會(huì)返回一個(gè)空指針NULL脖律,用戶可以根據(jù)該指針的值判斷分配空間是否成功

delete運(yùn)算符

delete運(yùn)算符的一般格式

delete 指針變量 (對變量)
或
delete [] 指針變量 (對數(shù)組)

例如要撤銷上面用new開辟的存放單精度的空間谢肾,應(yīng)該

delete p;

對于數(shù)組

char *p = new char[10];
delete [] p;

臨時(shí)開辟一個(gè)存儲(chǔ)空間存放一個(gè)結(jié)構(gòu)體數(shù)據(jù)

#include <iostream>
#include <string>
using namespace std;

struct  Student
{
    int num;
    string name;
    char sex;
};

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

    Student *p; // 定義指向結(jié)構(gòu)體類型Student的指針變量p
    p = new Student; // 用new關(guān)鍵字開辟一個(gè)存放Student型數(shù)據(jù)的空間小泉,把地址給p
    p->name = "wang"; // 向結(jié)構(gòu)體成員賦值
    p->num = 10001;
    p->sex = 'm';
    cout<< p->name<<" "<< p->num<<" "<<p->sex<<endl; // 輸出成員值
    delete p; // 釋放空間

    return 0;
}

new關(guān)鍵字開辟一個(gè)存放Student型數(shù)據(jù)的空間芦疏,空間的大小由系統(tǒng)根據(jù)Student自動(dòng)算出冕杠,不必指定。并賦值給p酸茴,這樣p指向該空間分预。雖然沒有定義結(jié)構(gòu)體變量,但是可以通過指針變量p訪問該空間薪捍,可以對該空間中各成員賦值笼痹,并輸出它們的值。最后使用delete釋放空間酪穿。

共用體類型

C++除了允許用戶直接聲明結(jié)構(gòu)體類型外凳干,還可以聲明共用體類型,也叫聯(lián)合類型被济。從形式上看救赐,它與結(jié)構(gòu)體有些相似,如下聲明一個(gè)名為Data的共用體類型并定義3個(gè)共用體變量a只磷、b 经磅、c

union Data
{
    int i;
    char ch;
    double d;
} a,b,c;

共用體與結(jié)構(gòu)體的不同在于:系統(tǒng)為結(jié)構(gòu)體中各成員分別分配存儲(chǔ)單元,而共用體則是各成員公占一段存儲(chǔ)單元喳瓣,例如上面的定義是把一個(gè)整型成員馋贤、一個(gè)字符型成員、一個(gè)雙精度成員安排在同一個(gè)地址開始的內(nèi)存單元中

枚舉類型

如果一個(gè)變量只能有幾種可能的值畏陕,可以定義為枚舉類型配乓。所謂“枚舉”是將變量的值一一列舉出來,變量的值只能在列舉出來的值的范圍內(nèi)

聲明枚舉類型用enum開頭惠毁,例如:

enum weekday {
    sun,
    mon,
    tue,
    wed,
    thu,
    fri,
    sat
};

上面聲明了一個(gè)枚舉類型weekday犹芹,花括號中 sun,mon,...sat等稱為枚舉元素或枚舉常量

聲明枚舉類型的一般形式為:

enum 枚舉類型名 { 枚舉常量表 };

在聲明枚舉類型后,可以用它來定義變量鞠绰,如:

weekday workday, week_end;

這樣 workday, week_end就被定義為枚舉類型weekday的變量

在C語言中腰埂,枚舉類型名包括關(guān)鍵字enum,以上的定義也可以寫為:

enum weekday workday, week_end;

C++中允許不寫enum,但是保留了C的寫法

根據(jù)以上對枚舉類型weekday的聲明蜈膨,枚舉變量的值只能是sun到sat之一屿笼。例如:

workday = mon;
week_end = sun;

也可以在聲明枚舉類型時(shí)同時(shí)定義枚舉變量

enum weekday {
    sun,
    mon,
    tue,
    wed,
    thu,
    fri,
    sat
} workday, week_end;

需要注意:枚舉元素的名字本身沒有特定的含義。例如不因?qū)懗蓅un或sunday就自動(dòng)表示星期天翁巍,它只是一個(gè)符號驴一,究竟用來代表什么含義,完全由程序員考慮灶壶,并在程序中對它們做相應(yīng)的處理

說明:

  • 枚舉元素按常量處理肝断,故稱枚舉常量。它們不是變量,不能對它們賦值胸懈,即枚舉元素的值是固定的担扑。例如:
sun = 0; mon = 0; //錯(cuò)誤,不能用賦值語句對枚舉常量賦值
  • 枚舉元素作為常量趣钱,它們是有值的涌献,其值是一個(gè)整數(shù),編譯系統(tǒng)按定義時(shí)的順序?qū)λ鼈冑x值為0羔挡,1洁奈,2,3...绞灼。在上面的說明中利术,sun的值為0,mon的值為1.......sat的值為6低矮,如果有賦值語句
workday = mon; //把枚舉常量值賦給枚舉變量workday印叁,workday的值等于1

也可以在聲明枚舉類型時(shí)自己指定枚舉元素的值,如:

enum weekday {
    sun = 7,
    mon = 1,
    tue,
    wed,
    thu,
    fri,
    sat
};

表示指定sun的值為7军掂,mon的值為1轮蜕,以后按順序加1,sat為6

  • 枚舉值可以用來做判斷比較蝗锥,按整數(shù)比較規(guī)則進(jìn)行比較跃洛。如:
if (workday == mon) // 判斷workday的值是否等于mon
{

}
if (workday > sun) // 判斷workday的值是否大于sun
{

}

按其在聲明枚舉類型時(shí)的順序比較,如果定義時(shí)未另行指定终议,則第一個(gè)枚舉元素的值為0.

  • 不能把一個(gè)整數(shù)直接賦給一個(gè)枚舉變量汇竭,枚舉變量只能接受枚舉類型數(shù)據(jù),如:
workday = mon;  // 正確
week_end = 1;  //錯(cuò)誤,它們屬于不同的類型

應(yīng)該先進(jìn)行強(qiáng)制轉(zhuǎn)換才能賦值

week_end = (weekday)1;  //  C語言繼承下來的強(qiáng)制類型轉(zhuǎn)換形式
或者
week_end = weekday(1);  // C++風(fēng)格的強(qiáng)制類型轉(zhuǎn)換

用typedef聲明新的類型名

除了可以用以上方法聲明結(jié)構(gòu)體穴张、共用體细燎、枚舉等類型外,還可以用typedef聲明一個(gè)新的類型名來代替已有的類型名皂甘。如:

typedef int INTEGER; // 指定INTEGER代表int類型
typedef float REAL; // 指定REAL代表float類型

這樣玻驻,以下兩行就是等價(jià)的

int i,j; float a,b;
INTEGER i,j; REAL a.b;

為結(jié)構(gòu)體類型聲明一個(gè)新的名字

typedef struct Student
{
    int num;
    string name;
    char sex;
} STUDENT;

STUDENT stu; // 聲明變量

還可以進(jìn)一步用typedef聲明一個(gè)新的類型名,例如:

typedef int NUM[100]; // 聲明NUM為整型數(shù)組類型偿枕,包含100個(gè)元素
NUM n; // 定義n為包含100個(gè)整型元素的數(shù)組

typedef char * STRING; // 聲明STRING為 char * 類型璧瞬,即字符指針類型
STRING p, s[10]; // 定義p為char *型指針變量,s為char *類型的指針數(shù)組(有10個(gè)元素)

typedef int(*POINTER)(); //聲明POINTER為指向函數(shù)的指針類型
POINTER p1,p2; //p1,p2為POINTER類型的指針變量

歸納起來渐夸,聲明一個(gè)新的類型名的方法:

1嗤锉、先按定義變量的方法寫出定于語句(如: int i;)
2、將變量名換成新類型名(如將i換成COUNT, 即 int COUNT)
3捺萌、在最前面加typedef(如:typedef int COUNT)
4、然后可以用新類型名( 如:COUNT)去定義變量了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市桃纯,隨后出現(xiàn)的幾起案子酷誓,更是在濱河造成了極大的恐慌,老刑警劉巖态坦,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盐数,死亡現(xiàn)場離奇詭異,居然都是意外死亡伞梯,警方通過查閱死者的電腦和手機(jī)玫氢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谜诫,“玉大人漾峡,你說我怎么就攤上這事∮骺酰” “怎么了生逸?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長且预。 經(jīng)常有香客問我槽袄,道長,這世上最難降的妖魔是什么锋谐? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任遍尺,我火速辦了婚禮,結(jié)果婚禮上涮拗,老公的妹妹穿的比我還像新娘乾戏。我一直安慰自己,他們只是感情好多搀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布歧蕉。 她就那樣靜靜地躺著,像睡著了一般康铭。 火紅的嫁衣襯著肌膚如雪惯退。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天从藤,我揣著相機(jī)與錄音催跪,去河邊找鬼。 笑死夷野,一個(gè)胖子當(dāng)著我的面吹牛懊蒸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悯搔,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼骑丸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起通危,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤铸豁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后菊碟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體节芥,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年逆害,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了头镊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡魄幕,死狀恐怖相艇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梅垄,我是刑警寧澤厂捞,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站队丝,受9級特大地震影響靡馁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜机久,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一臭墨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧膘盖,春花似錦胧弛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至软棺,卻和暖如春红竭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喘落。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工茵宪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瘦棋。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓稀火,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赌朋。 傳聞我的和親對象是個(gè)殘疾皇子凰狞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容