跳转至

結構體

結構體(struct),可以看做是一系列稱為成員元素的組合體。

可以看做是自定義的數據類型。

Note

本頁描述的 struct 不同於 C 中 struct,在 C++ 中 struct 被擴展為類似 class 的類説明符。

定義結構體

1
2
3
4
5
6
7
8
struct Object {
  int weight;
  int value;
} e[array_length];

const Object a;
Object b, B[array_length], tmp;
Object *c;

上例中定義了一個名為 Object 的結構體,兩個成員元素 value, weight,類型都為 int

} 後,定義了數據類型為 Object 的常量 a,變量 b,變量 tmp,數組 B,指針 c。對於某種已經存在的類型,都可以使用這裏的方法進行定義常量、變量、指針、數組等。

關於指針:不必強求掌握。

定義指針

如果是定義內置類型的指針,則與平常定義指針一樣。

如果是定義結構體指針,在定義中使用 StructName* 進行定義。

1
2
3
4
5
6
struct Edge {
  /*
  ...
  */
  Edge* nxt;
};

上例僅作舉例,不必糾結實際意義。

訪問/修改成員元素

可以使用 變量名.成員元素名 進行訪問。例如可以使用 cout << var.v 來輸出 varv 成員。

也可以使用 指針名->成員元素名 或者 使用 (*指針名).成員元素名 進行訪問。例如使用 (*ptr).v = tmp 或者 ptr->v = tmp 可以將結構體指針 ptr 指向的結構體的成員元素 v 賦值為 tmp:。

為什麼需要結構體?

首先,條條大路通羅馬,可以不使用結構體達到相同的效果。但是結構體能夠顯式地將成員元素(在算法競賽中通常是變量)捆綁在一起,如本例中的 Object 結構體,便將 value,weight 放在了一起(定義這個結構體的實際意義是表示一件物品的重量與價值)。這樣的好處邊是限制了成員元素的使用。
想象一下,如果不使用結構體而且有兩個數組 value[], Value[],很容易寫混淆。但如果使用結構體,能夠減輕出現使用變量錯誤的幾率。

並且不同的結構體(結構體類型,如 Object 這個結構體)或者不同的結構體變量(結構體的實例,如上方的 e 數組)可以擁有相同名字的成員元素(如 tmp.value,b.value),同名的成員元素相互獨立(擁有獨自的內存,比如説修改 tmp.value 不會影響 b.value 的值)。
這樣的好處是可以使用盡可能相同或者相近的變量去描述一個物品。比如説 Object 裏有 value 這個成員變量;我們還可以定義一個 Car 結構體,同時也擁有 value 這個成員;如果不使用結構體,或許我們就需要定義 valueOfObject[],valueOfCar[] 等不同名稱的數組來區分。

如果想要更詳細的描述一種事物,還可以定義成員函數。請參考 獲取詳細內容。

更多的操作?

詳見

注意事項

為了訪問內存的效率更高,編譯器在處理結構中成員的實際存儲情況時,可能會將成員對齊在一定的字節位置,也就意味着結構中有空餘的地方。因此,該結構所佔用的空間可能大於其中所有成員所佔空間的總和。

參考資料

  1. Class - zh.cppreference.com
  2. Data structures - cplusplus.com
  3. 對齊方式 - Microsoft Docs