結構 Struct

在前一章 類別 Class 中,我們仔細介紹了什麼是類別,以及它和物件導向的關係。

這章我們要來介紹類別的兄弟:結構 Struct。

什麼是結構

在前一章中,我們講到在 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
用法 通常用於簡單資料結構 通常用於更複雜的物件
封裝 封裝性較弱 封裝性較強

這邊我們來看兩個比較大的差異,繼承的話就先不講,因為我們還沒講到這個概念。

成員預設可見性

結構和類別之間最最最最重要的差異在於成員預設的可見性。

在前一節的例子中,我們確切地寫出關鍵字 privatepublic。如果我們不特別寫出關鍵字,那麼這個結構或是類別就會使用預設的可見性。

比如說:

class Person
{
    std::string name;
    int age;
};

這樣 nameage 都會預設為 private,反之,若是使用 struct,那麼 nameage 就都會是 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。