View
248
Download
8
Embed Size (px)
Citation preview
建立靜態資料成員
關鍵字: static
靜態資料成員不屬於特定物件,而是該類物件所共同擁有的,可做為類別範圍裡的靜態變數。
宣告靜態資料成員語法
static 資料型別 資料成員名稱 ;
注意:靜態資料不屬於特定物件,所以靜態資料的初值無法利用建構子來設定
靜態資料成員的初值設定,將在類別的宣告外,利用 ::來完成初值設定
資料型別 類別名稱 ::資料成員名稱 = 初值 ;
靜態資料成員的存取
存取靜態資料成員的語法如下:
類別名稱 ::靜態資料成員名單
一個班級裡學生的例子
學生類別的靜態資料: (1) 姓名 (2) 學號 (3) 數學成績 (4) 英文成績 (5) 班級人數
靜態資料
相同班級的學生,所擁有的班級人數都是相同的,所以這類別共同擁有的資料可以設為靜態資料
所以學生人數可以設為靜態資料
靜態成員函數 宣告靜態成員函數,與宣告一般函式相同,只要在宣告函式前,加上 static
靜態函式的呼叫 類別名稱 :: 靜態成員函數名稱 ( 輸入參數 )
Ps: 靜態函數中只能修改靜態資料,不能修改一般資料程員
繼承
基礎類別 (Base class) :哺乳類是貓、狗類別的基礎類別
衍生類別 (Derived class) :貓、狗類別是繼承哺乳類的衍生類別
哺乳類
貓 狗
哺乳類
食肉目 靈長目
貓科 犬科 人科
貓屬豹屬
家貓種
人屬
人種
一般化
特殊化
抽象化過程
便於管理系統中的物件 系統的擴充更加容易 程式碼的再用
基礎類別的特性基礎類別的特性增加的特性修改的特性繼承
衍生類別的非靜態資料成員
基儲類別的非靜態資料成員
人
學生 社會人士
姓名身高體重性別
姓名身高體重性別學號
數學成績
英文成績
姓名身高體重性別職業薪水
基礎類別 (Base class) :人 衍生類別 (Derived class) :學生、社會人士
類別屬性資料的繼承
學號 數學成績 英文成績
姓名 身高體重 性別
基礎類別 (Base class) :動物 衍生類別 (Derived class) :魚、鳥
動物
魚 鳥
呼吸吃東西
睡覺
呼吸吃東西
睡覺
游泳
呼吸吃東西
睡覺
飛
類別方法的繼承
游泳
( 動物 類別 )呼吸 吃東西
睡覺
魚 的 類別
繼承機制 繼承權限的等級: public, protected, private
class 衍生類別 : 繼承權限 基礎類別
public 繼承
基礎類別中成員的存取權限等級
public
protected
private
衍生類別繼承後存取權限等級
public
protected
無法存取
繼承
基儲類別成員為 private ,衍生類別將無法存取public 和 protected 等級將不會改變
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;}
class bird : public animal{ public: void fly(); };
void bird::fly(){cout<<“Fly……”<<endl;}
採取 public 繼承方式bird 物件不能使用 animal 的 sleep 方法
eat 方法為 protected 等級breathe 方法為 public 等級
Public 繼承後的情形class bird : public animal{
public:
void fly();
};
class bird : public animal{
protected:
void eat();
public:
void breathe();
void fly();
};
紅字代表經過繼承 animal 後增加的方法實際 bird class 的程式碼
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 等級。
}
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 等級
存取基礎類別的成員
想在衍生類別的成員函數中,存取基礎類別內同名的成員,可以利用 ::,語法如下
基礎類別名稱 ::資料成員
void bird::eat(){animal::eat();}
private 繼承
基礎類別中成員的存取權限等級
public
protected
private
衍生類別繼承後存取權限等級
private
private
無法存取
繼承
基儲類別成員為 private ,衍生類別將無法存取public 和 protected 等級將變成 private 等級
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;}
class bird : private animal{ public: void fly(); };
void bird::fly(){cout<<“Fly……”<<endl;}
採取 public 繼承方式bird 類別不能使用 animal 的 sleep 方法
eat 方法為 private 等級breathe 方法為 private 等級
Public 繼承後的情形class bird : public animal{
public:
void fly();
};
class bird : public animal{
private:
void eat();
void breathe();
public:
void fly();
};
紅字代表經過繼承 animal 後增加的方法實際 bird class 的程式碼
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 等級。
}
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 等級
protected 繼承
基礎類別中成員的存取權限等級
public
protected
private
衍生類別繼承後存取權限等級
protected
protected
無法存取
繼承
基儲類別成員為 private ,衍生類別將無法存取public 和 protected 等級將變成 protected 等級
下回分解