C++ 小社

Class & Structure

 【簡報】蘇西

【講師】children 

可能是?或是看蘇西有沒有來得及回學校

Class 是什麼?

假設你今天要寫一個遊戲,

遊戲裡面有很多角色,

每個角色都有等級、血量、攻擊力等資料。

 

有什麼方法,可以讓我們寫起來輕鬆一點嗎?

絕對沒有偷PY放學簡報喔

反正我自己偷自己沒毛病吧

用  Class

Class 是什麼?

可以把 class 想成一個餅乾模型,你就可以用那個模型製作很多餅乾,每個餅乾都具有某些屬性。

一個餅乾稱之為一個「物件」(Object)  

Class 是什麼?

例子:

Class

角色模板

屬性 1: 名稱

屬性 2: 血量

屬性 3: 等級

名稱= 忍者

血量=100

等級=5

名稱= 超人

血量=90

等級=10

名稱= 玩家

血量=20

等級=1

Object

Object

Object

C++ Class 語法

Class 怎麼寫

class ClassName { //宣告 class 的名稱

	public/private/protected: // 指定接下來內容的存取範圍是否公開
    
    variables; // 宣告會用到的變數
    
    functions(){} // 宣告會用到的函式
};

// 一個 class 裡面可以同時有 public/private/protected 多個部分 
// 下一頁看範例
ClassName ObjectName;
ClassNamr ObjectName;

宣告 Class (類別)

宣告 Object (物件)

Class 怎麼寫

#include <iostream>
#include <string>

using namespace std;

// 定義一個類別名為 'Person'

class Person {
public:
    // 會用到的變數
    string name;
    int age;
    
    // 成員函式「自我介紹」
    void introduce()
    {
        cout << 你好,我的名字是 " << name << " 。我 "
             << age << " 歲" << endl;
    }
};

Class 怎麼寫

int main()
{   
    // 建立一個 Person 類別的物件
    Person Suzy;
    
    // 設定他的變數
  
    Suzy.name = "Suzy";
    Suzy.age = 16;
    
    // 呼叫 introduce() 成員函式
    
    Suzy.introduce();

    return 0;
}

Public / Private / Protected

  • public: 宣告為 public 的成員可以從 class 外部存取。

 

  • private: 宣告為 private 的成員只能在 class 內部存取。

 

 

  • protected: 宣告為 protected 的成員可以在 class 內部和衍生類別(derived classes)中存取。

你可以寫一個 public 的函式,在裡面裝private 的函式

等下說,先假裝沒看到

下一頁看範例!

Public / Private / Protected

#include <iostream>
using namespace std;

class Base {
public:
    // public , 可於 class 外部直接存取
    void publicMethod() {
        cout << "This is a public method." << endl;
    }

private:
    // private , 僅於 class 內部存取
    void privateMethod() {
        cout << "This is a private method." << endl;
    }

public:
    // 弄一個public 函數存取 private 成員
    void accessPrivateMethod() {
        privateMethod();
    }
};

Public / Private / Protected


int main() {
    Base baseObj;

    // 測試 public 成員
    baseObj.publicMethod();   // 可直接存取

    // 測試 private 成員
    // baseObj.privateMethod(); // 無法直接存取, 會導致編譯錯誤
    baseObj.accessPrivateMethod(); // 透過 public 方法間接存取

    return 0;
}

Derived Class (衍生類別 / 子類別)

「繼承」是物件導向程式設計中一個重要也是核心的觀念,動詞原文為 inherit 。這裡的意思中文用「遺傳」比較恰當,子代會從親代遺傳一些特性。

「物件導向」的概念後面會介紹

總之:

Subclass =Derived Class (衍生類別/子類別) 會繼承Base Class (父類別) 的所有變數及成員函式

Derived Class (衍生類別 / 子類別)

語法

class DerivedClass : public BaseClass{
  // members....
  // member function 
}

注意這個是寫在 int main () 上面喔,不是裡面

Derived Class (衍生類別 / 子類別)

應用:

寫一個 Base Class 介紹人,和 Subclass 拿來裝不同種類的人(例:老師、學生等)以便依照不同子類別的需求紀錄不同變數

#include <iostream>
#include <string>

using namespace std;


// Base Class: Person (父類別)

class Person {
protected: 
    string name;
    int age;

  
    void displayBaseInfo() const {
        cout << "姓名: " << name << endl;
        cout << "年齡: " << age << endl;
    }
};

Derived Class (衍生類別 / 子類別)

// Subclass 1: Student (學生)

class Student : public Person {
public: // 變數設為 public
    string studentID; // 學生獨有的變數


    void displayInfo() const {
        cout << "--- 學生資訊 ---" << endl;
        displayBaseInfo();
        cout << "學號: " << studentID << endl;
    }
};


// Subclass 2: Teacher (老師)

class Teacher : public Person {
public:
    string subject; // 老師獨有的變數

    
    void displayInfo() const {
        cout << "--- 老師資訊 ---" << endl;
        displayBaseInfo();
        cout << "教學科目: " << subject << endl;
    }
};

Derived Class (衍生類別 / 子類別)

int main() {
   
    Teacher lee; 
   
    lee.name = "李老師";
    lee.age = 30;
    lee.subject = "物理"; 

    
    lee.displayInfo();
    cout << endl;

    
    Student Suzy;

   
    Suzy.name = "Suzy";
    Suzy.age = 16;
    Suzy.studentID = "111222";


    Suzy.displayInfo();

    return 0;
}

C++ Structure 語法

Structure(又稱 Struct),英翻中則為結構(體),是一種用來整合不同資料型態的自訂資料型態,讓我們能夠更方便地管理和使用相關的變數。

總之,結構體可讓我們把多個不同型態的變數(如 int、char、float 等)放在一起,形成一個集合。 可以視為「輕量版」的 class

Structure 怎麼寫

#include <iostream>
#include <string>
using namespace std;

struct Student {
    int id;        // 學號
    string name; // 姓名
    int age;      // 年齡
};
int main() {
    Student student1; // 宣告 Student 結構體變數
    student1.id = 12345;
    student1.name = "Suzy";
    student1.age = 16;

    // 輸出學生資料
    cout << "ID: " << student1.id << endl;
    cout << "Name: " << student1.name << endl;
    cout << "Age: " << student1.age << endl;

    return 0;
}

宣告 Struct

在 main () 裡使用它

Structure 怎麼寫

#include <iostream>
#include <string> // 包含 <string> 才能使用 std::string

using namespace std;

void printBook(Books book); // 函式原型:使用 Books 結構體作為參數

// 宣告一個結構體型態 Book
struct Books
{
    // 將 char 陣列替換為 std::string
    string title;   // 書標題
    string author;  // 書作者
    string subject; // 書類目
    int book_id;    // 書 ID
};

範例

int main()
{
    Books Book1;       // 定義結構體型態 Books 的變數 Book1
    Books Book2;       // 定義結構體型態 Books 的變數 Book2

    // Book1 詳述
    Book1.title = "C++ 教學";     // 原本使用 strcpy
    Book1.author = "Runoob";    // 原本使用 strcpy
    Book1.subject = "程式語言";   // 原本使用 strcpy
    Book1.book_id = 12345;

    // Book2 詳述
    Book2.title = "CSS 教學";     // 原本使用 strcpy
    Book2.author = "Runoob";    // 原本使用 strcpy
    Book2.subject = "前端技術";   // 原本使用 strcpy
    Book2.book_id = 12346;

    // 輸出 Book1 訊息
    printBook(Book1);

    cout << endl; // 增加空行

    // 輸出 Book2 訊息
    printBook(Book2);

    return 0;
}

// 函式定義
void printBook(Books book)
{
    cout << "書標題 : " << book.title << endl;
    cout << "書作者 : " << book.author << endl;
    cout << "書類目 : " << book.subject << endl;
    cout << "書 ID : " << book.book_id << endl;
}

小實作

用 class 或是 struct

寫一份程式碼可以

1. 建立數個「銀行帳號」

2. 銀行帳號應該包含提款、存款、匯款給另一個銀行帳號的函式

參考資料

這個講的有更深一點,有興趣歡迎自行閱讀

或是你有想到更酷的應用我也不反對

C++ 小社Class & Structure

By Suzy Huang

C++ 小社Class & Structure

  • 58