C++中構造體的類型界說和初始化和變量援用。本站提示廣大學習愛好者:(C++中構造體的類型界說和初始化和變量援用)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中構造體的類型界說和初始化和變量援用正文
C++構造體類型的界說和初始化
有時須要將分歧類型的數據組分解一個無機的全體,以供用戶便利地應用。這些組合在一個全體中的數據是相互接洽的。例如,一個先生的學號、姓名、性別、年紀、成就、家庭地址等項,都是這個先生的屬性,見圖
可以看到學號(num)、姓名(name)、性別(sex)、年紀(age)、成就(score )、地址(addr)是與姓名為“Li Fun”的先生有關的。假如在法式中將num,name,sex,age,score,addr分離界說為相互自力的變量,就難以反應出它們之間的內涵接洽。應該把它們組織成一個組合項,在一個組合項中包括若干個類型分歧(固然也能夠雷同)的數據項。C和C++許可用戶本身指定如許一種數據類型,它稱為構造體。它相當於其他高等說話中的記載(record)。
例如,可以經由過程上面的聲明來樹立如圖所示的數據類型。
struct Student//聲明一個構造體類型Student { int num; //包含一個整型變量num char name[20]; //包含一個字符數組name,可以包容20個字符 char sex; //包含一個字符變量sex int age; //包含一個整型變量age float score; //包含一個單精度型變量 char addr[30]; //包含一個字符數組addr,可以包容30個字符 }; //最初有一個分號
如許,法式設計者就聲清楚明了一個新的構造體類型Student(struct是聲明構造體類型時所必需應用的症結字,不克不及省略),它向編譯體系聲明: 這是一種構造體類型,它包含num, name, sex, age, score, addr等分歧類型的數據項。應該解釋Student是一個類型名,它和體系供給的尺度類型(如int、char、float、double 一樣,都可以用來界說變量,只不外構造體類型須要事前由用戶本身聲明罷了。
聲明一個構造體類型的普通情勢為:
struct 構造體類型名 {成員表列};
構造體類型名用來作構造體類型的標記。下面的聲明中Student就是構造體類型名。年夜括號內是該構造體中的全體成員(member),由它們構成一個特定的構造體。上例中的num,name,sex,score等都是構造體中的成員。在聲明一個構造體類型時必需對各成員都停止類型聲明即類型名 成員名;每個成員也稱為構造體中的一個域(field)。成員表列又稱為域表。
聲明構造體類型的地位普通在文件的開首,在一切函數(包含main函數)之前,以便本文件中一切的函數都能應用它來界說變量。固然也能夠在函數中聲明構造體類型。
在C說話中,構造體的成員只能是數據(如下面例子中所表現的那樣)。C++對此加以擴大,構造體的成員既可以包含數據(即數據成員),又可以包含函數(即函數成員),以順應面向對象的法式設計。
然則因為C++供給了類(class )類型,普通情形下,不用應用帶函數的構造體,是以在本章中只引見只含數據成員的構造體,有關包括函數成員的構造體將在後續章節停止引見。
構造體類型變量的界說辦法及其初始化
以上只是指定了一種構造體類型,它相當於一個模子,但個中並沒有詳細數據,體系也不為之分派現實的內存單位為了能在法式中應用構造體類型的數據,應該界說構造體類型的變量,並在個中寄存詳細的數據。
界說構造體類型變量的辦法可以采用以下3種辦法界說構造體類型的變量。
1) 先聲明構造體類型再界說變量名
如下面已界說了一個構造體類型Student,可以用它來界說構造體變量。如:
在C說話中,在界說構造體變量時,要在構造體類型名後面加上症結字Sttuct,C++ 保存了C的用法,如:
struct Student studentl, student2;
倡導讀者在編寫C++法式時,應用C++新提出來的辦法,即不用在界說構造體變量時加症結字Struct,如許應用更便利,並且與第8章中引見的用類(class)名界說類對象的用法分歧。
以上界說了student1和student2為構造體類型Student的變量,即它們具有Student類型的構造。如圖所示。
在界說了卻構體變量後,體系會為之分派內存單位。例如student1和student2在內存中各占63個字節(4+20+1+4+4+30=63)。
2) 在聲明類型的同時界說變量。例如:
struct Student //聲明構造體類型Student { int num; char name[20]; char sex; int age; float score; char addr[30]; }student1, student2; //界說兩個構造體類型Student的變量student1,student2
這類情勢的界說的普通情勢為:
struct 構造體名 { 成員表列 }變量名表列;
3) 直接界說構造體類型變量。其普通情勢為:
struct //留意沒有構造體類型名 { 成員表列 }變量名表列;
這類辦法固然正當,但很少應用。倡導先界說類型後界說變量的第(1)種辦法。在法式比擬簡略,構造體類型只在本文件中應用的情形下,也能夠用第(2)種辦法。
關於構造體類型,有幾點要解釋:
1) 不要誤以為但凡構造體類型都有雷同的構造。現實上,每種構造體類型都有本身的構造,可以界說出很多種詳細的構造體類型。
2) 類型與變量是分歧的概念,不要混雜。只能對構造體變量中的成員賦值,而不克不及對構造體類型賦值。在編譯時,是不會為類型分派空間的,只為變量分派空間。
3) 對構造體中的成員(即“域”),可以零丁應用,它的感化與位置相當於通俗變量。
4) 成員也能夠是一個構造體變量。如:
struct Date //聲明一個構造體類型Date { int month; int day; int year; }; struct Student //聲明一個構造體類型Student { int num; char name[20]; char sex; int age; Date birthday; char addr[30]; }student1, student2; //界說student1和student2為構造體類型Student的變量
起首聲明一個Date類型,它代表“日期”,包含3個成員:rnomh(月)、day (日)、year(年)。然後在聲明Studcm類型時,將成員birthday指定為Date類型。Student的構造見圖所示。已聲明的類型Date與其他類型(如im,char)—樣,也能夠用來界說成員的類型。
5) 構造體中的成員名可以與法式中的變量名雷同,但兩者沒有關系。例如,法式中可以另界說一個整型變量num,它與student中的num是兩回事,互不影響。
構造體變量的初始化
和其他類型變量一樣,對構造體變量可以在界說時指定初始值。如:
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中的數據如圖中所示。
也能夠采用聲明類型與界說變量離開的情勢,在界說變量時停止初始化:
Student student2 = { 10002, "Wang Li", "F", 20, 98, "Beijing"}; //Student是已聲明的構造體類型
C++構造體變量的援用
在界說了卻構體變量今後,固然可以援用這個變量,經常使用的辦法有以下幾種。
1) 可以將一個構造體變量的值賦給另外一個具有雷同構造的構造體變量。
如下面的student1和student2都是student類型的變量,可以如許賦值:
student1= student2;
2) 可以援用一個構造體變量中的一個成員的值。
例如, student1.num表現構造體變量student1中的成員的值,假如student1的值如圖所示,則student1.num的值為10001。
援用構造體變量中成員的普通方法為:
構造體變量名.成員名
例如可以如許對變量的成員賦值:
student1.num=10010;
3) 假如成員自己也是一個構造體類型,則要用若干個成員運算符,一級一級地找到最低一級的成員。
例如,對下面界說的構造體變量student1,可以如許拜訪各成員:
student1.num (援用構造體變量student1中的num成員)
假如想援用student1變量中的birthday成員中的month成員,不克不及寫成student1.month,必需逐級援用,即
student1.birthday.month=12; (援用構造體變量student1中的birthday成員中的month成員)
4) 不克不及將一個構造體變量作為一個全體停止輸出和輸入。
例如,已界說student1和student2為構造體變量,而且它們已有值。不克不及妄圖如許輸入構造體變量中的各成員的值
cin>>student1;
只能對構造體變量中的各個成員分離停止輸出和輸入。
5) 對構造體變量的成員可以像通俗變量一樣停止各類運算(依據其類型決議可以停止的運算品種)。例如:
student2.score=student1.score; sum=student1.score+student2.score; student1.age++; ++student1.age;
因為“.”運算符的優先級最高,student1.age++相當於(student1.age)++ 。++是對student1.age停止自加運算,而不是先對age停止自加運算。
6) 可以援用構造體變量成員的地址,也能夠援用構造體變量的地址。如:
cout<<&student1; //輸入student1的首地址 cout<<&student1.age; //輸入student1.age的地址
構造體變量的地址重要用作函數參數,將構造體變量的地址傳遞給形參。
【例】援用構造體變量中的成員。
#include <iostream> using namespace std; struct Date//聲明構造體類型Date { int month; int day; int year; }; struct Student//聲明構造體類型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,並對student2初始化 int main( ) { student1=student2; //將student2各成員的值付與student1的響應成員 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; }
運轉成果以下:
10002 Wang Li f 5/23/1982 89.5