- C++語言程序設計
- 千鋒教育高教產品研發部編著
- 2188字
- 2019-07-30 17:37:43
2.2 構造數據類型
C++的構造類型主要有數組、枚舉、結構體、聯合體和類,關于類將在后面章節中詳細介紹,本節簡單介紹其他幾種構造類型。
2.2.1 數組
有時需要在程序中表示許多類型相同的數據,如記錄一個班級每名學生某門課程的成績,假設這個班級有60名學生,在程序中定義60個不相關的實型變量是非常煩瑣的,這時可以用數組來表示這60名學生某門課程的成績。數組變量可以存放一組具有相同類型的數據,其語法格式如下:
數據類型 數組名[數組元素個數];
其中,數據類型既可以是簡單數據類型,又可以是構造數據類型。上面提到60名學生某門課程的成績可以表示為:
float score[60];
訪問數組中的元素可以通過數組名加下標的方式,下標范圍從0到數組元素個數減1,如用score[0]訪問數組中第一個元素,即第一名學生的成績;score[59]訪問數組中最后一個元素,即第60名學生的成績。下面的語句可以輸出第10名學生的成績。
cout <<score[9]<<endl;
字符數組是一種常用的數組,它是指數組中的每個元素都是字符,這樣就可以用字符數組描述字符串變量,具體示例如下:
char str[9]="qianfeng";
上述語句中,str數組有9個存儲空間,除了存儲字符串中的8個字符外,還在最后一個存儲單元中存儲字符串結束標志'\0'。上述語句定義完字符數組后,用str[3]表示字符'n',用str表示整個字符串,下面的語句就可以直接輸出str整個字符串,具體示例如下:
cout <<str <<endl;
當觀眾去電影院看電影時,通常電影票上寫著幾排幾座,此時觀眾首先會根據排號找到座位所在的行,然后根據座號找到座位所在的列,類似這樣的數據都可以用二維數組來描述,其語法格式如下:
數組類型 數組名[行數(常量表達式)][列數(常量表達式)];
假如需要記錄60名學生3門課程的成績,可以通過如下方式定義:
float score[60][3];
其中,行號范圍為0~59,表示60名學生;列號范圍為0~2,表示3門課程,這個數組總有180個元素,即對應180個成績。數組元素在內存中是按順序存放的,如score數組的存放方式如圖2.7所示。

圖2.7 score數組的存放方式
類似地,還可以定義多維數組,它的定義與二維數組類似,但由于多維數組不易于想象、難以調試且較占用內存,在實際開發中很少用到,因此不再贅述。
2.2.2 枚舉
在生活中,表示男女性別時,有兩種取值:Male、Female。程序中可以用整數來表示這種數據,具體示例如下:
int Gender;//Gender取值為0或1,0表示Male,1表示Female
這種表示有兩個缺點:一是不直觀,二是容易出錯。如果Gender賦值為3,在編譯時不會報錯,但這顯然有問題,此時Gender不再表示男女性別。在C++中,可以用枚舉這個數據類型來解決這個問題。枚舉的使用很像一個整數類型,其語法格式如下:
enum枚舉類型名{常量1,常量2,…,常量n};
它表示定義一種枚舉的數據類型,具有這種數據類型的變量所有可以取的值都列在后面的括號中。定義描述性別的枚舉類型,具體示例如下:
enum Gender{M ale,Female};
接下來,可以通過枚舉類型Gender定義變量,具體示例如下:
Gender gender;
這時,變量gender的取值就有兩種,即Male、Female。如果希望變量gender表示Male,只需把Male賦值給gender,具體示例如下:
gender=Male;
枚舉類型中的每個元素的值實際上都是整數,枚舉類型本質上就是一個整數的集合,默認情況下,第一個枚舉元素被賦值為0,接下來的枚舉元素取值依次是前一個枚舉元素的取值加1。根據實際情況,程序中也可以顯式地指定某個枚舉元素的值,具體示例如下:
enumW eek{Sun,Mon,Tue=3,Wed,Thu=3,Fri,Sat};
上述語句中,Sun值為0,Mon值為1,Tue值為3,Wed值為4,Thu值為3,Fri值為4,Sat值為5。從此示例中可以得出,同一枚舉類型的不同常量取值不是唯一的。
在C++中,另一種使用枚舉類型的方法是定義一個匿名enum枚舉類型,即enum后不給出具體的類型名,將其中的枚舉常量作為一般常量使用,具體示例如下:

上述語句中,枚舉常量Min和Max可以作為一般的符號常量使用,事實上,匿名枚舉的主要用途就是定義符號常量。
2.2.3 結構體
假設要存儲有關學生的信息,則可能要存儲學生的姓名、學號、年齡、成績等。這時就希望有一種數據類型可以將這些信息存儲在一個單元中,顯然數組不能符合要求,但C++中的結構體可以符合要求。結構體是一種比數組更靈活的數據類型,因為同一個結構可以存儲多種類型的數據,這樣就可以將有關學生的信息放在一個結構體中,從而將數據的表示合并到一起。如果要表示整個班級學生,則可以使用結構體數組。結構體也是類的基石,學習結構體將使大家離面向對象程序設計的核心更近一步,其語法格式如下:

其中,struct是關鍵字,不可以省略;結構體名要符合標識符的命名規則,可以省略;成員類型除了可以是基本數據類型外,還可以是構造數據類型。具體示例如下:

定義了結構體類型后,在表示具體的一個學生時,就可以定義這個結構體類型的變量,具體示例如下:
Student stu;
當存儲學生信息時,就可以為結構體中的各個成員分別賦值,具體示例如下:
strcpy(stu.name,"小千"); stu.id=2018010101; stu.age=18; stu.score=98.0f;
為使某個結構體變量有初始值,可以在定義這個變量時直接為它初始化,具體示例如下:
Student stu1={"小鋒",2018010102,18,99.0f};
2.2.4 聯合體
聯合體是一種數據格式,它能夠存儲不同的數據類型,但只能同時存儲其中的一種類型。簡單理解,結構體可以同時存儲int、long和double,但聯合體只能存儲int、long和double中的一種類型,因此聯合體常用于節省內存。定義和使用聯合體的方法和結構體十分類似,也需要首先定義聯合體內部的成員類型,其語法格式如下:

假設管理一個商品目錄,其中有一些商品的編號為整數,而另一些商品的編號為字符串,這時就可以用聯合體來表示,具體示例如下:

定義了聯合類型后,在表示具體的一個商品編號時,就可以定義這個聯合體類型的變量,具體示例如下:

上述代碼中,當id.id_num賦值為65時,輸出id.id_name為A。
- The DevOps 2.3 Toolkit
- Hands-On Data Structures and Algorithms with JavaScript
- Python高級編程
- Apache Mahout Clustering Designs
- ANSYS Fluent 二次開發指南
- 從零開始學Linux編程
- 從零學Java設計模式
- AI自動化測試:技術原理、平臺搭建與工程實踐
- MySQL數據庫應用實戰教程(慕課版)
- Android嵌入式系統程序開發(基于Cortex-A8)
- 和孩子一起學編程:用Scratch玩Minecraft我的世界
- RESTful Web API Design with Node.js(Second Edition)
- CISSP in 21 Days(Second Edition)
- 深度學習:基于Python語言和TensorFlow平臺(視頻講解版)
- Python編程零基礎入門