結構體(struct)的使用
結構體(struct)的使用
結構體在很多場合中非常常用,可以將若干個不同的資料型別的變數或陣列封裝在一起,一儲存自定義的資料結構,方便儲存一些複合資料。
結構體的定義
定義一個結構體的基本格式如下
struct Name{
//一些基本的資料結構或者自定義的資料型別
}
例如,需要儲存一個學生的學號、性別、姓名和專業,就可以這樣定義:
struct studentInfo{
int id;
char gender;//'F'or'M'
char name[20];
char major[20];
}Alice,Bob,stu[1000];
其中studentInfo是結構體的名字,內部定義了id(學號)、gender(性別)、name(名字)和major(專業)。而大括號外定義了studentInfo型的Alice和Bob代表兩個結構體變數
結構體也可以按照基本資料型別那樣定義
studentInfo Alice;
studentInfo stu[1000];
需要注意的是,結構體裡面能定義除了自己本身(這樣會引起迴圈定義的問題)之外的任何資料型別。不過雖然不能定義自己本身,但是可以定義自身型別的指標變數。例如:
struct node{
node n;//不能定義node型變數
node* next;//可以定義node*型別的指標變數
}
訪問結構體內的元素
兩種方法:“.”操作和“->”操作。現在把studentInfo型別定義成下面這樣:
struct studentIfo{
int id;
char name[20];
studentInfo* next;
}stu, *p;
這樣studentInfo中多了一個指標next來指向下一個學生的地址,且結構體變數中定義了普通型別變數stu和指標變數p。
於是訪問stu中變數的寫法如下:
stu.id
stu.name
stu.next
訪問指標變數p中元素的寫法如下:
(*p).id
(*p).name
(*p).next
另一種訪問結構體指標變數內元素的更簡潔的寫法:
p->id
p->name
p->next
使用*或->訪問結構體指標變數內元素的寫法是完全等價的。
結構體的初始化
使用“建構函式”的方法來進行初始化。所謂建構函式就是用來初始化結構體的一種函式,它直接定義在結構體中。建構函式的一個特點就是它不需要寫返回型別,且函式名與結構體名相同
一般對於一個普通定義的結構體,其內部會生成一個預設的建構函式(但是不可見)
struct studentInfo{
int id;
char gender;
//預設生成的建構函式
studentInfo(){}//沒有返回型別,沒有引數,沒有函式體
};
那麼,如果想要自己手動提供id和gender的初始化引數,要怎麼做?需要提供初始化引數來對結構體內部的變數進行賦值
struct studentInfo{
int id;
char gender;
//把下面引數用以對結構體內部變數進行賦值
studentInfo(int _id, char _gender){
//賦值
id = _id;
gender = _gender;
}
}
其中 _ id和 _ gender都是變數名,只要不和已有變數名衝突就行。
建構函式也可以簡化成一行
xstruct studentInfo{
int id; char gender;
studentInfo(int _id, char _gender):id(_id), gender(_gender) {}
}
這樣可以在需要時直接對結構體變數進行賦值了:
studentInfostu = studentIfo(10086, 'M')
注意:如果自己重新定義了建構函式,就不能不經初始化就定義結構體變數。為了既能不初始化就定義結構體變數,又能享受初始化帶來的便捷。我們可以吧studentInfo(){}手動加上。這意味著,只要引數個數和型別不完全相同,就可以定義任意多個建構函式,以適應不同的初始化場合。例項:
struct studentIfo{
int id;
char gender;
//可以不初始化就定義結構體變數
studentInfo(){}
//只初始化gender
studentInfo(char _gender){
gender = _gender;
}
//同時初始化gender和id
studentIfo(int _id, char _gender){
id = _id;
char = _char;
}
};