結構體
一、什么是結構體
假設我們要存儲有關籃球運動員的信息,則可能存儲Ta的姓名、工資、身高、體重、平均得分等,希望有一種數據格式可以將這些信息存放在一個單元中。
因此引入了結構的概念
-
結構是用戶定義的類型
-
結構中所有元素的類型可以不相同
-
創建結構包括兩步:
1.定義結構描述——它描述並標記了能夠存儲在結構中的各種數據類型
2.按描述創建結構變量(結構數據對象)
-
結構體成員默認為 public
1.定義結構:
它的本質是創建了一個名為information的新的數據類型
struct information
{
char name[20];
float salary;
double height;
};
2.聲明結構變量:
information zhangsan; //C++允許在聲明結構變量時省略關鍵字
struct information lisi;
//或者同時在定義結構后面聲明
struct information
{
char name[20];
float salary;
double height;
}wangmazi;
其中zhangsan,lisi,wangmazi都是information結構體的實例,可以被分配和擁有自己的內存,以保存其成員數據。
盡管3個結構體變量具有不同的名稱,但每個變量都包含具有相同名稱的成員。
3.初始化結構體:
有兩種方式初始結構體變量:使用初始化列表或構造函數
1)初始化列表
初始化結構體變量成員的最簡單的方法是使用初始化列表。初始化列表是用於初始化一組內存位置的值列表。列表中的項目用逗號分隔並用大括號括起來。
定義和初始化information變量的方式是:先指定變量名,后接賦值運算符和初始化列表:
information LiHua = {"LiHua",5000,191};
也可以僅初始化結構體變量的部分成員:
information LiHua = {"LiHua",5000};
這里只有name和salary成員被初始化,height成員未初始化。但是,如果某個結構成員未被初始化,則所有跟在它后面的成員都需要保留為未初始化。使用初始化列表時,C++不提供跳過成員的方法。
還有一點很重要,不能在結構體聲明中初始化結構體成員,因為結構體聲明只是創建一個新的數據類型,還不存在這種類型的變量。
2)構造函數初始化結構體
以下是一個名為 Employee 的結構體的聲明語句,它包含一個具有兩參數的構造函數,以便在創建一個 Employee 變量而不向其傳遞任何參數時,提供默認值:
struct Employee
{
string name; // 員工姓名
int vacationDays, // 允許的年假
daysUsed; //已使用的年假天數
Employee (string n ="",int d = 0) // 構造函數
{
name = n;
vacationDays = 10;
daysUsed = d;
}
};
4.訪問結構體成員:
結構體成員的訪問方式與類的公共成員一樣,都是使用點運算符。但是,類的數據成員通常是私有的,必須通過函數訪問。因為結構數據成員是公共的,所以它們可以被直接訪問,並且可以像常規變量一樣使用。
zhangsan.name="張三";
zhangsan.salary=4000;
cout<<zhangsan.name<<endl;
二、結構體數組
定義:該數組的每個元素都是一個結構體。
//以下語句定義了一個名為infoList的數組,它有20個元素,每個元素都是一個information結構體
information infoList[20];
//下面的表達式引用了infoList[5]的salary成員
infoList[5].salary;
在算法競賽中結構體的使用非常普遍,務必掌握