31
建建建建建建建建 建建建static 建建建建建建建建建建建建建 建建建建建建建建建建建建建 建建建建建 ,, 建建建建建建建建

建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

  • View
    248

  • Download
    8

Embed Size (px)

Citation preview

Page 1: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

建立靜態資料成員

關鍵字: static

靜態資料成員不屬於特定物件,而是該類物件所共同擁有的,可做為類別範圍裡的靜態變數。

Page 2: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

宣告靜態資料成員語法

static 資料型別 資料成員名稱 ;

注意:靜態資料不屬於特定物件,所以靜態資料的初值無法利用建構子來設定

靜態資料成員的初值設定,將在類別的宣告外,利用 ::來完成初值設定

資料型別 類別名稱 ::資料成員名稱 = 初值 ;

Page 3: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

靜態資料成員的存取

存取靜態資料成員的語法如下:

類別名稱 ::靜態資料成員名單

Page 4: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

一個班級裡學生的例子

學生類別的靜態資料: (1) 姓名 (2) 學號 (3) 數學成績 (4) 英文成績 (5) 班級人數

Page 5: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

靜態資料

相同班級的學生,所擁有的班級人數都是相同的,所以這類別共同擁有的資料可以設為靜態資料

所以學生人數可以設為靜態資料

Page 6: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

靜態成員函數 宣告靜態成員函數,與宣告一般函式相同,只要在宣告函式前,加上 static

靜態函式的呼叫 類別名稱 :: 靜態成員函數名稱 ( 輸入參數 )

Ps: 靜態函數中只能修改靜態資料,不能修改一般資料程員

Page 7: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

繼承

Page 8: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

基礎類別 (Base class) :哺乳類是貓、狗類別的基礎類別

衍生類別 (Derived class) :貓、狗類別是繼承哺乳類的衍生類別

哺乳類

貓 狗

Page 9: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

哺乳類

食肉目 靈長目

貓科 犬科 人科

貓屬豹屬

家貓種

人屬

人種

一般化

特殊化

抽象化過程

Page 10: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

便於管理系統中的物件 系統的擴充更加容易 程式碼的再用

基礎類別的特性基礎類別的特性增加的特性修改的特性繼承

Page 11: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

衍生類別的非靜態資料成員

基儲類別的非靜態資料成員

Page 12: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

學生 社會人士

姓名身高體重性別

姓名身高體重性別學號

數學成績

英文成績

姓名身高體重性別職業薪水

基礎類別 (Base class) :人 衍生類別 (Derived class) :學生、社會人士

Page 13: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

類別屬性資料的繼承

學號 數學成績 英文成績

姓名 身高體重 性別

Page 14: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

基礎類別 (Base class) :動物 衍生類別 (Derived class) :魚、鳥

動物

魚 鳥

呼吸吃東西

睡覺

呼吸吃東西

睡覺

游泳

呼吸吃東西

睡覺

Page 15: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

類別方法的繼承

游泳

( 動物 類別 )呼吸 吃東西

睡覺

魚 的 類別

Page 16: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

繼承機制 繼承權限的等級: public, protected, private

class 衍生類別 : 繼承權限 基礎類別

Page 17: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

public 繼承

基礎類別中成員的存取權限等級

public

protected

private

衍生類別繼承後存取權限等級

public

protected

無法存取

繼承

基儲類別成員為 private ,衍生類別將無法存取public 和 protected 等級將不會改變

Page 18: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

class animal { private : void sleep(); protected: void eat(); public: void breathe(); };

void animal::breathe(){cout<<“Breathe…”<<endl;} void animal::eat(){cout<<“Eat…”<<endl;} void animal::sleep(){cout<<“Sleep…”<<endl;}

Page 19: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

class bird : public animal{ public: void fly(); };

void bird::fly(){cout<<“Fly……”<<endl;}

採取 public 繼承方式bird 物件不能使用 animal 的 sleep 方法

eat 方法為 protected 等級breathe 方法為 public 等級

Page 20: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

Public 繼承後的情形class bird : public animal{

public:

void fly();

};

class bird : public animal{

protected:

void eat();

public:

void breathe();

void fly();

};

紅字代表經過繼承 animal 後增加的方法實際 bird class 的程式碼

Page 21: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

int main(){

bird Little_bird;Little_bird.fly(); 可以執行,因為 fly 為 bird 類別的 public 等級

Little_bird.breathe(); 可以執行,因為 bird 是利用 public 方式繼承 animal 而且 breathe 在 animal 中是 public

等級 Little_bird.eat(); 不可以執行,因為 bird 利用 public 方式繼承

animal 而 eat 在 animal 中是 protected 等級,所以不行直接執行 ( 要另外用一個 public 等級的方法來使用 eat() 方法。

Little_bird.sleep(); 絕對不能執行,因為 sleep 在 animal 中是 private 等級。

}

Page 22: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

class bird : public animal{ public: void fly(); void eat(); };

void bird::fly(){cout<<“Fly……”<<endl;} void bird::eat(){animal::eat();}

採取 public 繼承方式bird 類別不能使用 animal 的 sleep 方法

eat 方法為 protected 等級breathe 方法為 public 等級

Page 23: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

存取基礎類別的成員

想在衍生類別的成員函數中,存取基礎類別內同名的成員,可以利用 ::,語法如下

基礎類別名稱 ::資料成員

void bird::eat(){animal::eat();}

Page 24: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

private 繼承

基礎類別中成員的存取權限等級

public

protected

private

衍生類別繼承後存取權限等級

private

private

無法存取

繼承

基儲類別成員為 private ,衍生類別將無法存取public 和 protected 等級將變成 private 等級

Page 25: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

class animal { private : void sleep(); protected: void eat(); public: void breathe(); };

void animal::breathe(){cout<<“Breathe…”<<endl;} void animal::eat(){cout<<“Eat…”<<endl;} void animal::sleep(){cout<<“Sleep…”<<endl;}

Page 26: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

class bird : private animal{ public: void fly(); };

void bird::fly(){cout<<“Fly……”<<endl;}

採取 public 繼承方式bird 類別不能使用 animal 的 sleep 方法

eat 方法為 private 等級breathe 方法為 private 等級

Page 27: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

Public 繼承後的情形class bird : public animal{

public:

void fly();

};

class bird : public animal{

private:

void eat();

void breathe();

public:

void fly();

};

紅字代表經過繼承 animal 後增加的方法實際 bird class 的程式碼

Page 28: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

int main()

{

bird Little_bird;Little_bird.fly(); 可以執行,因為 fly 為 bird 類別的 public 等級

Little_bird.breathe(); 不可以執行,因為 bird 利用 private 方式繼承,所以 bird 中的 breathe() 是 private 等級,故不行直接執行

( 要另外用一個 public 等級的方法來使用 breathe() 方法。

Little_bird.eat(); 不可以執行,因為 bird 利用 private 方式繼承 所以 bird 中的 eat() 是 private 等級,故不行直接執行 ( 要另外用一個 public 等級的方法來使用 eat() 方法。

Little_bird.sleep(); 絕對不能執行,因為 sleep 在 animal 中是 private 等級。

}

Page 29: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

class bird : private animal{ public: void fly(); void eat(); void breathe(); };

void bird::fly(){cout<<“Fly……”<<endl;} void bird::eat(){animal::eat();} void bird::breathe(){animal::breathe();}

採取 public 繼承方式bird 類別不能使用 animal 的 sleep 方法

eat 方法為 private 等級breathe 方法為 private 等級

Page 30: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

protected 繼承

基礎類別中成員的存取權限等級

public

protected

private

衍生類別繼承後存取權限等級

protected

protected

無法存取

繼承

基儲類別成員為 private ,衍生類別將無法存取public 和 protected 等級將變成 protected 等級

Page 31: 建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。

下回分解