EasyC++,結(jié)構(gòu)體初探
大家好,我是梁唐。
這是EasyC++系列的第13篇,咱們來聊聊C++當(dāng)中的結(jié)構(gòu)體。
想要追求更好閱讀體驗的同學(xué),可以點擊文末的「閱讀原文」,訪問github倉庫。
結(jié)構(gòu)體
定義結(jié)構(gòu)體
數(shù)組可以存儲多個同類型的變量,但如果我們想要存儲多個不同類型的變量呢?比如說我們想要存儲一個學(xué)生的姓名、年齡、性別、考試分?jǐn)?shù),這些變量可能string, int, float都有,顯然就不能使用數(shù)組了。
為了滿足這樣的存儲要求,我們可以使用C++當(dāng)中的結(jié)構(gòu)體(struct)。在同一個結(jié)構(gòu)體當(dāng)中,我們可以定義許多種不同類型的變量,就可以滿足我們各種各樣的需求了。如果我們想要存儲多個這樣的內(nèi)容,還可以將它定義成數(shù)組。
結(jié)構(gòu)體和類已經(jīng)很接近了,所以理解結(jié)構(gòu)體對于理解面向?qū)ο蠓浅S袔椭km然算法競賽當(dāng)中一般用不到面向?qū)ο?,但是對于開發(fā)者來說,面向?qū)ο罂梢哉f是必學(xué)的內(nèi)容。C++ primer中說,結(jié)構(gòu)體是C++ OOP(面向?qū)ο缶幊?的基石。
我們使用關(guān)鍵字struct來定義一個結(jié)構(gòu)體:
- struct student {
- string name;
- bool gender;
- double scores;
- };
表示定義了一個結(jié)構(gòu)體,它的類型名是student,花括號當(dāng)中括起來的內(nèi)容是結(jié)構(gòu)體的成員變量。注意student是類型名,也就是說我們可以用它來定義出student類型的變量:
- student xiaoming;
- student john;
我們可以用.來訪問結(jié)構(gòu)體內(nèi)部的元素:
- cout << john.name << endl;
struct的定義有兩種寫法,既可以寫在main函數(shù)外部,也可以寫在main函數(shù)內(nèi)部。如:
- // 寫法1
- struct student {
- string name;
- bool gender;
- double scores;
- };
- int main() {
- // do something
- return 0;
- }
- // 寫法2
- int main() {
- struct student {
- string name;
- bool gender;
- double scores;
- };
- // do something
- return 0;
- }
邏輯上兩種方式完全一樣,只是第一種方式student類型可以被任何函數(shù)使用,但如果寫在main函數(shù)內(nèi)部,就只能在main函數(shù)內(nèi)部使用。
結(jié)構(gòu)體變量也可以定義在函數(shù)內(nèi)部定義,定義在外部的變量被所有函數(shù)所共享,也就是全局變量。C++ primer當(dāng)中提倡盡量使用外部結(jié)構(gòu)體。
初始化方式
我們可以和數(shù)組一樣,在花括號內(nèi)使用逗號進行分隔,如:
- student xiaoming = {"xiaoming", 1, 3.5};
編譯器會按照順序,分別將"xiaoming"賦值給name,1賦值給gender,3.5賦值給score。我們也可以使用C++11的列表初始化方式省略掉中間的等于號:
- student xiaoming {"xiaoming", 1, 3.5};
結(jié)構(gòu)體數(shù)組
定義了結(jié)構(gòu)體之后,我們還可以像是基礎(chǔ)變量類型一樣定義結(jié)構(gòu)體數(shù)組。
- struct student {
- string name;
- bool gender;
- double scores;
- };
- student sts[10];
對于結(jié)構(gòu)體數(shù)組來說,我們也可以使用列表初始化方式來初始化,由于結(jié)構(gòu)體本身的初始化就用到花括號,所以數(shù)組的初始化會使用到花括號的嵌套,像是這樣:
- student sts[2] = {
- {"xiaoming", 1, 3.6},
- {"john", 1, 5.2}
- };