c++

結構

結構是什麼?

我們如果要儲存一個學生的基本資料

舉個栗子

string name = "Bob";
int age = 17;
float weight = 175.6;
bool isDead = false;

那如果要儲存一整個班的資料,要怎麼辦呢?

  • 跟函式長得很像
  • 可以把不同的基本資料型態變數組合,形成新的資料型態
  • 物件導向:
    • 把變數視為一個物件
    • 物件裡面的所有數值可以表達物件的狀態

用struct!那它到底可以幹嘛呢?

結構的用法

格式:

struct 結構名稱 {

    資料型態1 變數名稱1;

    資料型態2 變數名稱2;

    資料型態3 變數名稱3;

};

 

創建結構

struct Student{
  string name;
  int age;
  float weight;
  bool isDead;
};

創建一個資料型態為 Student 的變數叫做 student1

使用結構

Student student1;

要存取 struct 型別中的某一個成員,請使用點(.)

student1.name = "Annie";
student1.age = "15";
student1.weight = "45.4";
cout << "1號同學的名字 => " << student1.name << endl;
cout << "1號同學的年紀 => " << student1.age << endl;
cout << "1號同學的體重 => " << student1.weight << endl;

在宣告的同時用「= { ... }」賦值,此舉稱為初始化

使用結構

Student student1={"beth",17,40,false};

→ 變數的順序和 struct 的定義相同

與陣列一樣,沒被初始化的變數會被初始化為 0,前提是你有把大括號寫出來

Student student2={};
Student student3;// 只有宣告,沒有初始化,因此變數值未定義

也可以把全班的學生加到一個struct陣列

使用結構

#include<iostream>
using namespace std;
struct Student{
    string name;
    int age;
    float weight;
    bool isDead;
}
int main () {
	Student students[20];
    students[0].name = "Annie";
    students[0].age = 15;
    students[0].weight = 45.4;
    students[1].name = "Bob";
    students[1].age = 17;
    students[1].weight = 60.5;
    cout << "1號同學的名字 => " << students[0].name << endl;
    cout << "1號同學的年紀 => " << students[0].age << endl;
    cout << "2號同學的名字 => " << students[1].name << endl;
    cout << "2號同學的年紀 => " << students[1].age << endl;
}

/*
輸出結果:
1號同學的名字 => Annie
1號同學的年紀 => 15
2號同學的名字 => Bob
2號同學的年紀 => 17
*/

結構函式

  •  C++ 引入了物件導向與 class 的觀念,連帶導致 struct 變為一種 class,只是所有的屬性預設為 public
  • 這代表 C++ 的struct 也可以有建構子(constructor)、成員函式(member function)等。
  • struct:通常用來封裝「純資料」,較少包含複雜的成員函式
  • class:通常用來封裝較複雜的物件

struct VS. class

建構子

  • 建構子名稱必須與類別(或 struct)名稱相同,且不具有傳回值
  • 用來在物件建立時初始化資料成員,常見用法包括:

    • 預設建構子:無參數,用來設定初始值
    • 帶參數的建構子:根據傳入參數初始化成員
// 帶參數的建構子(使用初始化列表)
    Student(const string &n, int a) : name(n), age(a) {}
    
    // 預設建構子也可以定義
    Student() : name("Unknown"), age(0) {}
 Student s1;                // 使用預設建構子,name="Unknown", age=0
 Student s2{"Alice", 20};   // 使用帶參數的建構子
  • 我們可以在Student結構裡面設定一些動作

成員函式

struct Student{
    string name;
    int age;
    float weight;
    bool isDead;
    void isWalking () {
    	cout << name << " is walking." << endl;
    }
    void isEating(string food) {
    	cout << name << " is eating " << food << endl;
    }
};
  • 呼叫函式

成員函式

#include<iostream>
using namespace std;
struct Student{
    string name;
    int age;
    float weight;
    bool isDead;
    void isWalking () {
    	cout << name << "正在走路" << endl;
    }
    void isEating(string food) {
    	cout << name << "正在吃" << food << endl;
    }
};
int main () {
    Student student;
    student.name = "貝絲";
    student.isWalking();
    student.isEating("班日");
}

/*
輸出結果:
貝絲正在走路
貝絲正在吃班日
*/

題目練習

c++ 小社課 第二堂

By Beth chen

c++ 小社課 第二堂

  • 121