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)存單元,student1
和student2
在內(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)體變量最仑。如上面的student1
和 student2
都是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è)Studen
t類型的數(shù)據(jù)质和。將結(jié)構(gòu)體變量stu
的起始地址賦給指針變量p
,也就是使p
指向st
u稚字,然后對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ù)malloc
和free
來分配和撤銷內(nèi)存空間裆熙。C++
提供了較簡單功能較強(qiáng)的運(yùn)算符new
和delete
來取代malloc
和free
函數(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)去定義變量了