C++中結(jié)構(gòu)體的類型定義和初始化以及變量引用
C++結(jié)構(gòu)體類型的定義和初始化
有時(shí)需要將不同類型的數(shù)據(jù)組合成一個(gè)有機(jī)的整體,以供用戶方便地使用。這些組合在一個(gè)整體中的數(shù)據(jù)是互相聯(lián)系的。例如,一個(gè)學(xué)生的學(xué)號(hào)、姓名、性別、年齡、成績(jī)、家庭地址等項(xiàng),都是這個(gè)學(xué)生的屬性,見圖
可以看到學(xué)號(hào)(num)、姓名(name)、性別(sex)、年齡(age)、成績(jī)(score )、地址(addr)是與姓名為“Li Fun”的學(xué)生有關(guān)的。如果在程序中將num,name,sex,age,score,addr分別定義為互相獨(dú)立的變量,就難以反映出它們之間的內(nèi)在聯(lián)系。應(yīng)當(dāng)把它們組織成一個(gè)組合項(xiàng),在一個(gè)組合項(xiàng)中包含若干個(gè)類型不同(當(dāng)然也可以相同)的數(shù)據(jù)項(xiàng)。C和C++允許用戶自己指定這樣一種數(shù)據(jù)類型,它稱為結(jié)構(gòu)體。它相當(dāng)于其他高級(jí)語言中的記錄(record)。
例如,可以通過下面的聲明來建立如圖所示的數(shù)據(jù)類型。
struct Student//聲明一個(gè)結(jié)構(gòu)體類型Student { int num; //包括一個(gè)整型變量num char name[20]; //包括一個(gè)字符數(shù)組name,可以容納20個(gè)字符 char sex; //包括一個(gè)字符變量sex int age; //包括一個(gè)整型變量age float score; //包括一個(gè)單精度型變量 char addr[30]; //包括一個(gè)字符數(shù)組addr,可以容納30個(gè)字符 }; //最后有一個(gè)分號(hào)
這樣,程序設(shè)計(jì)者就聲明了一個(gè)新的結(jié)構(gòu)體類型Student(struct是聲明結(jié)構(gòu)體類型時(shí)所必須使用的關(guān)鍵字,不能省略),它向編譯系統(tǒng)聲明: 這是一種結(jié)構(gòu)體類型,它包括num, name, sex, age, score, addr等不同類型的數(shù)據(jù)項(xiàng)。應(yīng)當(dāng)說明Student是一個(gè)類型名,它和系統(tǒng)提供的標(biāo)準(zhǔn)類型(如int、char、float、double 一樣,都可以用來定義變量,只不過結(jié)構(gòu)體類型需要事先由用戶自己聲明而已。
聲明一個(gè)結(jié)構(gòu)體類型的一般形式為:
struct 結(jié)構(gòu)體類型名 {成員表列};
結(jié)構(gòu)體類型名用來作結(jié)構(gòu)體類型的標(biāo)志。上面的聲明中Student就是結(jié)構(gòu)體類型名。大括號(hào)內(nèi)是該結(jié)構(gòu)體中的全部成員(member),由它們組成一個(gè)特定的結(jié)構(gòu)體。上例中的num,name,sex,score等都是結(jié)構(gòu)體中的成員。在聲明一個(gè)結(jié)構(gòu)體類型時(shí)必須對(duì)各成員都進(jìn)行類型聲明即類型名 成員名;每一個(gè)成員也稱為結(jié)構(gòu)體中的一個(gè)域(field)。成員表列又稱為域表。
聲明結(jié)構(gòu)體類型的位置一般在文件的開頭,在所有函數(shù)(包括main函數(shù))之前,以便本文件中所有的函數(shù)都能利用它來定義變量。當(dāng)然也可以在函數(shù)中聲明結(jié)構(gòu)體類型。
在C語言中,結(jié)構(gòu)體的成員只能是數(shù)據(jù)(如上面例子中所表示的那樣)。C++對(duì)此加以擴(kuò)充,結(jié)構(gòu)體的成員既可以包括數(shù)據(jù)(即數(shù)據(jù)成員),又可以包括函數(shù)(即函數(shù)成員),以適應(yīng)面向?qū)ο蟮某绦蛟O(shè)計(jì)。
但是由于C++提供了類(class )類型,一般情況下,不必使用帶函數(shù)的結(jié)構(gòu)體,因此在本章中只介紹只含數(shù)據(jù)成員的結(jié)構(gòu)體,有關(guān)包含函數(shù)成員的結(jié)構(gòu)體將在后續(xù)章節(jié)進(jìn)行介紹。
結(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)體類型再定義變量名
如上面已定義了一個(gè)結(jié)構(gòu)體類型Student,可以用它來定義結(jié)構(gòu)體變量。如:
在C語言中,在定義結(jié)構(gòu)體變量時(shí),要在結(jié)構(gòu)體類型名前面加上關(guān)鍵字Sttuct,C++ 保留了C的用法,如:
struct Student studentl, student2;
提倡讀者在編寫C++程序時(shí),使用C++新提出來的方法,即不必在定義結(jié)構(gòu)體變量時(shí)加關(guān)鍵字Struct,這樣使用更方便,而且與第8章中介紹的用類(class)名定義類對(duì)象的用法一致。
以上定義了student1和student2為結(jié)構(gòu)體類型Student的變量,即它們具有Student類型的結(jié)構(gòu)。如圖所示。
在定義了結(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 //聲明結(jié)構(gòu)體類型Student { int num; char name[20]; char sex; int age; float score; char addr[30]; }student1, student2; //定義兩個(gè)結(jié)構(gòu)體類型Student的變量student1,student2
這種形式的定義的一般形式為:
struct 結(jié)構(gòu)體名 { 成員表列 }變量名表列;
3) 直接定義結(jié)構(gòu)體類型變量。其一般形式為:
struct //注意沒有結(jié)構(gòu)體類型名 { 成員表列 }變量名表列;
這種方法雖然合法,但很少使用。提倡先定義類型后定義變量的第(1)種方法。在程序比較簡(jiǎn)單,結(jié)構(gòu)體類型只在本文件中使用的情況下,也可以用第(2)種方法。
關(guān)于結(jié)構(gòu)體類型,有幾點(diǎn)要說明:
1) 不要誤認(rèn)為凡是結(jié)構(gòu)體類型都有相同的結(jié)構(gòu)。實(shí)際上,每一種結(jié)構(gòu)體類型都有自己的結(jié)構(gòu),可以定義出許多種具體的結(jié)構(gòu)體類型。
2) 類型與變量是不同的概念,不要混淆。只能對(duì)結(jié)構(gòu)體變量中的成員賦值,而不能對(duì)結(jié)構(gòu)體類型賦值。在編譯時(shí),是不會(huì)為類型分配空間的,只為變量分配空間。
3) 對(duì)結(jié)構(gòu)體中的成員(即“域”),可以單獨(dú)使用,它的作用與地位相當(dāng)于普通變量。
4) 成員也可以是一個(gè)結(jié)構(gòu)體變量。如:
struct Date //聲明一個(gè)結(jié)構(gòu)體類型Date { int month; int day; int year; }; struct Student //聲明一個(gè)結(jié)構(gòu)體類型Student { int num; char name[20]; char sex; int age; Date birthday; char addr[30]; }student1, student2; //定義student1和student2為結(jié)構(gòu)體類型Student的變量
首先聲明一個(gè)Date類型,它代表“日期”,包括3個(gè)成員:rnomh(月)、day (日)、year(年)。然后在聲明Studcm類型時(shí),將成員birthday指定為Date類型。Student的結(jié)構(gòu)見圖所示。已聲明的類型Date與其他類型(如im,char)—樣,也可以用來定義成員的類型。
5) 結(jié)構(gòu)體中的成員名可以與程序中的變量名相同,但二者沒有關(guān)系。例如,程序中可以另定義一個(gè)整型變量num,它與student中的num是兩回事,互不影響。
結(jié)構(gòu)體變量的初始化
和其他類型變量一樣,對(duì)結(jié)構(gòu)體變量可以在定義時(shí)指定初始值。如:
struct Student { int num; char name[20]; char sex; int age; float score; char addr[30]; }student1={10001, "Zhang Xin", 'M', 19, 90.5, "Shanghai"};
這樣,變量student1中的數(shù)據(jù)如圖中所示。
也可以采取聲明類型與定義變量分開的形式,在定義變量時(shí)進(jìn)行初始化:
Student student2 = { 10002, "Wang Li", "F", 20, 98, "Beijing"}; //Student是已聲明的結(jié)構(gòu)體類型
C++結(jié)構(gòu)體變量的引用
在定義了結(jié)構(gòu)體變量以后,當(dāng)然可以引用這個(gè)變量,常用的方法有以下幾種。
1) 可以將一個(gè)結(jié)構(gòu)體變量的值賦給另一個(gè)具有相同結(jié)構(gòu)的結(jié)構(gòu)體變量。
如上面的student1和student2都是student類型的變量,可以這樣賦值:
student1= student2;
2) 可以引用一個(gè)結(jié)構(gòu)體變量中的一個(gè)成員的值。
例如, student1.num表示結(jié)構(gòu)體變量student1中的成員的值,如果student1的值如圖所示,則student1.num的值為10001。
引用結(jié)構(gòu)體變量中成員的一般方式為:
結(jié)構(gòu)體變量名.成員名
例如可以這樣對(duì)變量的成員賦值:
student1.num=10010;
3) 如果成員本身也是一個(gè)結(jié)構(gòu)體類型,則要用若干個(gè)成員運(yùn)算符,一級(jí)一級(jí)地找到最低一級(jí)的成員。
例如,對(duì)上面定義的結(jié)構(gòu)體變量student1,可以這樣訪問各成員:
student1.num (引用結(jié)構(gòu)體變量student1中的num成員)
如果想引用student1變量中的birthday成員中的month成員,不能寫成student1.month,必須逐級(jí)引用,即
student1.birthday.month=12; (引用結(jié)構(gòu)體變量student1中的birthday成員中的month成員)
4) 不能將一個(gè)結(jié)構(gòu)體變量作為一個(gè)整體進(jìn)行輸入和輸出。
例如,已定義student1和student2為結(jié)構(gòu)體變量,并且它們已有值。不能企圖這樣輸出結(jié)構(gòu)體變量中的各成員的值
cin>>student1;
只能對(duì)結(jié)構(gòu)體變量中的各個(gè)成員分別進(jìn)行輸入和輸出。
5) 對(duì)結(jié)構(gòu)體變量的成員可以像普通變量一樣進(jìn)行各種運(yùn)算(根據(jù)其類型決定可以進(jìn)行的運(yùn)算種類)。例如:
student2.score=student1.score; sum=student1.score+student2.score; student1.age++; ++student1.age;
由于“.”運(yùn)算符的優(yōu)先級(jí)最高,student1.age++相當(dāng)于(student1.age)++ 。++是對(duì)student1.age進(jìn)行自加運(yùn)算,而不是先對(duì)age進(jìn)行自加運(yùn)算。
6) 可以引用結(jié)構(gòu)體變量成員的地址,也可以引用結(jié)構(gòu)體變量的地址。如:
cout<<&student1; //輸出student1的首地址 cout<<&student1.age; //輸出student1.age的地址
結(jié)構(gòu)體變量的地址主要用作函數(shù)參數(shù),將結(jié)構(gòu)體變量的地址傳遞給形參。
【例】引用結(jié)構(gòu)體變量中的成員。
#include <iostream> using namespace std; struct Date//聲明結(jié)構(gòu)體類型Date { int month; int day; int year; }; struct Student//聲明結(jié)構(gòu)體類型Student { int num; char name[20]; char sex; Date birthday; //聲明birthday為Date類型的成員 float score; }student1,student2={10002,"Wang Li",'f',5,23,1982,89.5}; //定義Student 類型的變量student1,student2,并對(duì)student2初始化 int main( ) { student1=student2; //將student2各成員的值賦予student1的相應(yīng)成員 cout<<student1.num<<endl; //輸出student1中的num成員的值 cout<<student1.name<<endl; //輸出student1中的name成員的值 cout<<student1.sex<<endl; //輸出student1中的sex成員的值 cout<<student1.birthday.month<<'/'<<student1.birthday.day<<'/' <<student1.birthday.year<<endl; //輸出student1中的birthday各成員的值 cout<<student1.score<<endl; return 0; }
運(yùn)行結(jié)果如下:
10002 Wang Li f 5/23/1982 89.5
上一篇:詳解C++中的指針結(jié)構(gòu)體數(shù)組以及指向結(jié)構(gòu)體變量的指針
欄 目:C語言
本文標(biāo)題:C++中結(jié)構(gòu)體的類型定義和初始化以及變量引用
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2726.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)數(shù)怎么表達(dá)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法