什麼是結構
在前一章中,我們講到在 C++ 中,類別 Class 就像是物件的藍圖或是模板。
其實,Struct 和 Class 基本上是一樣的概念!結構一樣是物件的藍圖,一樣可以有不一樣的特徵和行為。
那如果是一樣的概念的話,為什麼要有結構呢?
C++ 中同時存在 Struct 和 Class 的原因可以追溯到歷史因素和程式語言的演進。
最初,C++ 從 C 程式語言繼承了 Struct 的概念。在 C 中,Struct 是一種將相關資料組合在一起的簡單方法,但它缺乏包含成員函式的能力(沒有行為)。
後來人們在開發 C++ 時,它著重在引入物件導向特性,同時保持與 C 語言的兼容性。因此,C++ 通過加入 Class 擴展了傳統的 Struct 功能。
在 C++ 中,Class 可以封裝資料和函式,提供更複雜的方式來建立複雜的實體和行為。
創建結構
結構和類別除了擁有類似的觀念以外,它們的創建手法也非常相似!
基本上,我們只需要將關鍵字 class
更改為 struct
就好了!
我們直接拿前一章的 Person
例子來看:
// 建立 Person 結構 struct Person { private: std::string name; int age; public: // 建構子: 定義如何創建這個結構 Person(std::string n, int a) { name = n; age = a; } // 這個結構可以做的行為 void introduce() { std::cout << "Hello, my name is " << name << " and I am " << age << " years old." << std::endl; } }; int main() { // 基於 Person 結構創建實體物件 Person person1("Alice", 25); Person person2("Bob", 30); // 使用結構中的行為 person1.introduce(); person2.introduce(); return 0; }
真的就是直接把關鍵字 class
更改為 struct
就可以勒!其他全部都一樣!當然輸出也會是一樣的。
類別 v.s. 結構
雖然說類別和結構非常類似,但他們還是有基本的差異的!
我們來看看這個比較表格:
特徵 | 結構 Struct | 類別 Class |
---|---|---|
成員預設可見性 | 預設為 public |
預設為 private |
繼承存取層級 | 預設為 public |
預設為 private |
用法 | 通常用於簡單資料結構 | 通常用於更複雜的物件 |
封裝 | 封裝性較弱 | 封裝性較強 |
這邊我們來看兩個比較大的差異,繼承的話就先不講,因為我們還沒講到這個概念。
成員預設可見性結構和類別之間最最最最重要的差異在於成員預設的可見性。
在前一節的例子中,我們確切地寫出關鍵字 private
和 public
。如果我們不特別寫出關鍵字,那麼這個結構或是類別就會使用預設的可見性。
比如說:
class Person { std::string name; int age; };
這樣 name
和 age
都會預設為 private
,反之,若是使用 struct
,那麼 name
和 age
就都會是 public
。
一般來說,Struct 會比較多用在儲存類似、簡單的資料,而且也會較少在 Struct 中看到函式。
這裡舉幾個適合使用 Struct 的資料:
Struct Point { int x; int y; }; struct Date { int day; int month; int year; }; struct Rectangle { float width; float height; }; struct Student { std::string name; int ID; float grade; };
總結
這章我們了解了什麼是結構 Struct、它的使用方式、以及它和類別 Class 的差異。
總歸來說,Struct 和 Class 非常相似,只是預設的成員可見性不同而已!
接下來讓我們看看更為細節的概念:建構子 Constructor。