本文章向大家介紹C++ 基礎知識,結構、聯合與列舉,主要使用實體、應用技巧、基本知識點總結和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下,
1. 結構

1.0 結構
陣列是相同型別元素的集合,相反,struct 是任意型別元素的集合,
代碼例子:
structAddress {constchar* name;intnumber;constchar* street;constchar* town; }// 初始化:Address jd = {"zs",1,"jd","t"};// 賦值jd.name ="ls";cout<< jd.name << endl;// 取值voidprint_add1(constAddress* add){cout<< add->name << endl << add->number << endl << add->street << endl << add->town << endl}// 如果 add 是一個指標,則 p->m 等價于 (*p).m// 也可以使用 . 運算子訪問它voidprint_add2(constAddress& add){cout<< add.name << endl << add.number << endl << add.street << endl << add.town << endl}
結構體型別的物件也可以被賦值和作為實參傳入函式,或者作為函式的結果回傳,
1.1 布局
結構體形式:
structReadout{charhour;intvalue;charseq;}// sizeof() -> 12structReadout{intvalue;charhour;charseq;}// sizeof() -> 8
記憶體在為成員分配空間時,順序與宣告結構的時候保持一致,因此,hour 的地址一定在 value 之前,在計算機中,很多機器要求一些特定型別的物件沿著系統結構設定的邊界分配空間,以便機器能高效地處理這些物件,上述代碼的結構體大小使用sizeof(Readout)計算時,真正的結果為 12,

實際撰寫程序中可以按照各自的尺寸排序(大的在前面),這樣可以在一定程度上減少空間的浪費,
1.1 名字
型別名字一出現即可馬上使用,無需等全部宣告完成,但是等到 struct 的宣告全部完成,才能宣告它的物件,
structLink { Link* previous;// 正確Link* successor;// 正確 }structNo_good { No_good member;// 錯誤,因為此時編譯器無法確定 No_good 的大小}
多個 struct 相互參考,需要提前宣告好 struct 的名字
structList;structLink { Link* pre; Link* suc; Link* member_of;intdata;}structList { Link* head;}
1.2 結構與類
struct 是一種 class, 它的成員默認是 public 的,struct 可以包含成員函式,尤其是建構式,
structPoint{intx;inty;};structPoints {vectorelem; Points(Point p0) { elem.push_back(p0); } Points(Point p0, Point p1) { elem.push_back(p0); elem.push_back(p1); }};intmain(){ Points x1{ {100,200} };cout<<"Hello Word !"<< endl;}
1.2 結構與陣列
同理可以定義陣列結構體
structPoint {intx, y;}structArray { Point elem[3];}intmain(){ Array points {{1,2}, {3,4}, {5,6}};inty2 = points.elem[2].y}
標準庫中的 array 也是一種 struct,與內置陣列相比,更加完善,
2. 聯合
union 是一種特殊的 struct,它的所有成員都分配在同一地址空間上,因此,一個union 實際占用的空間大小與其最大的成員一樣,在同一時刻 union 只能保存一個成員的值,
使用 union 的目的是讓資料更緊密,從而提高程式的性能,然而,大多數程式即使使用了 union 也不會提高太多,同時,使用 union 代碼容易出錯,union 一般最好不要出現在程式中,
enumType {str, num};structEntry {char*name; Type t;char* s;// 如果 t == str,使用 sinti;// 如果 t == num,使用 i}
在上述代碼中 s 和 i 不可能被同時使用,因此空間浪費掉了,因此可以使用 union 解決上述問題,
unionValue {char* s;inti;}structEntry {char* name; Type t; Value v;// 如果 t == str,使用 v.s,如果 t == num 使用 v.i}
3. 列舉
列舉型別用于存放用戶指定的一組整數值,
列舉型別分兩種
enum class 他的列舉值名字位于 enum 的區域作用域內,列舉值不會隱式地轉換成其他型別,

普通的 enum 它的列舉值名字與列舉型別本身位于同一個作用域中,列舉值隱式地轉換成整數,
建議使用 enum class
### 3.1 enum class
enum class 限定了作用域的強型別列舉,
函式呼叫:
enumclassTraffic_light {red, yellow, green}Traffic_light tr = Traffic_light::red;
列舉常用一些整數型別標識,每個列舉值是一個整數,標識某個列舉的型別稱為它的基礎型別,基礎型別必須是一種帶符號或無符號的整數型別,默認是 int,
可以顯式地指定:
enum class Warning: int {green, yellow, orange, red}
如果你認為上述的定義太浪費控制元件,可以使用 char 代替 int:
enum class Warning: char {green, yellow, orange, red} enumTraffic_light { tl_red, tl_yellow, tl_green };enumWarning{ green, yellow, orange, red };voidf(Traffic_light x){if(x == red) {printf("red"); }if(x == Warning::red) {printf("red"); }}
3.2 普通的 enum
“普通的 enum” 是指 c++ 在指出 enum class 之前提供的列舉型別,在很多 C 和 C++ 的代碼中都存在普通的 enum,普通的 enum 的列舉值位于 enum 本身所在的作用域中,它們隱式地轉換成某些整數型別的值,
enumTraffic_light { red, yellow, green}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/196892.html
標籤:其他
