# 實體、對象與類的概念
# 實體
# 什麼是實體?
是指客觀世界存在的某個事物
一所大學,例如:西安交通大學
某動物,例如:一隻羊
一本圖書,例如:《C++ 程序設計教程》
一篇文章,例如:“羊年趣賞羊聯”
# 如何描述實體?
通過對實體進行抽象,來描述實體
# 如何抽象描述實體?
每個實體都有其特徵和功能,特徵和功能通稱為屬性
實體與實體的不同,在於屬性的不同
從實體中抽取出若干特徵和功能,來表示實體
特徵指實體的靜態屬性,功能指實體的動態屬性
特徵和功能密切相關、相互依賴,不能割裂
# 對象
# 什麼是對象?
指被抽象描述的某個實體
對象 = 實體的特徵 + 實體的功能
對象 = 數據 + 函數
將數據和函數當作一個統一體
# 類
# 什麼是類?
具有相同特徵和功能的對象集合
對像是類的一個實例或個體或元素
所有公元日期→日期類
所有西安交大學生→西安交大學生類
整數集合→整數類
int k;//k 稱為整數變量,又稱整數對象 | |
struct date today;//today 稱日期結構體變量,又稱日期對象 |
# 將實體轉化為程序中的數據
C++ 程序中有四種基本數據類型:字符、整數、浮點、雙精度類型
當程序中涉及到的實體不能直接描述為基本數據類型時,只有描述成新的數據 (類型) 類是相同屬性的對象集合,其中某個對象的特徵和功能就是類的特徵和功能
- 學生 (數據) 類 (型) 的特徵和功能
特徵:姓名、性別、年齡、學號、成績、身高……
功能:上課、跑步、聽、說、讀、寫、……- 轎車 (數據) 類 (型) 的特徵和功能
特徵:型號、顏色、價格、出廠日期、輪子直徑……
功能:運動、鳴笛、加油、倒車、……
# 類與結構體
將數據和函數當作一個統一體,即 “類”
類是對客觀世界萬物的抽象描述
結構體是複合數據的統一體
結構體只有數據成員,沒有函數成員
結構體又稱為特殊的類
現在結構體中也可以包括函數成員
類的語法格式與結構體相似:
- 先定義類的數據成員和函數成員
- 再聲明具體對象 (變量)
- 然後使用對象 (變量)
# 類的定義
# 定義格式
class <類名> { | |
private: // 私有成員 | |
<數據成員說明語句>; | |
<函數成員說明語句>; | |
public: // 公有成員 | |
<數據成員說明語句>; | |
<函數成員說明語句>; | |
protected: // 保護成員 | |
<數據成員說明語句>; | |
<函數成員說明語句>; | |
}; |
# 舉例:定義實體時鐘錶類
- 特徵:即數據成員? 時、分、秒 型號、生產廠、出廠日期、價格等
- 功能:即函數成員? 設置時間 鐘錶運轉或運行 報時響鈴 顯示時間
class Clock // 定義鐘錶類 | |
{ | |
private: // 數據成員一般為私有成員 | |
int Hour; // 小時屬性 | |
int Minute; // 分鐘屬性 | |
int Second; // 秒屬性 | |
float Price; // 價格屬性 | |
public:// 函數成員一般為公有成員 | |
void Set(int h,int m,int s,float p); // 設置時間操作 | |
void Run(); // 鐘錶運轉操作 | |
void Report_Time(); // 報時響鈴操作 | |
void Show_Time(); // 顯示時間操作 | |
}; |
# 成員函數的定義方式
# 內聯函式
在類體內直接定義函數成員,該成員函數又稱內聯函數 在類體內定義內聯函數等同一般函數定義格式
class Clock // 定義鐘錶類 | |
{ | |
private: // 數據成員一般為私有成員 | |
int Hour; // 小時屬性 | |
int Minute; // 分鐘屬性 | |
int Second; // 秒屬性 | |
float Price; // 價格屬性 | |
public:// 函數成員一般為公有成員 | |
void Set(int h,int m,int s,float p); // 設置時間操作 | |
void Run(); // 鐘錶運轉操作 | |
void Report_Time(); // 報時響鈴操作 | |
void Show_Time() // 顯示時間操作 | |
{ | |
cout << Hour <<':'<< Minute <<':'<< Second; | |
}; | |
}; |
# 類體外定義函數成員
<類型> <類名>::<函數名>(<參數表>) | |
{ | |
<函數體> | |
} |
void Clock::Set(int h,int m,int s,float p) // 設置修改 4 個數據成員的值的函式 | |
{ | |
Hour = h; | |
Minute = m; | |
Second = s; | |
Price = p; | |
} | |
void Clock::Run() // 模擬鐘錶運行的函式 | |
{ | |
int i=0; | |
for(i=0;i<10;i++) // 指模擬運行 10 秒鐘 | |
{ | |
Second++; | |
if(Second==60) | |
{ | |
Second=0; | |
Minute++; | |
if(Minute==60) | |
{ | |
Minute=0; | |
Hour++; | |
if(Hour==24) { | |
Hour=0; | |
} | |
} | |
} | |
cout<<'\r'; // 不換行,返回當前的首位 | |
Sleep(1000); // 程序暫停運行 | |
Show_Time(); | |
} | |
} | |
void Clock::Report_Time() { | |
Show_Time(); | |
if ( Minute==0&&Second==0 ) { | |
for(int i=0;i<Hour;i++) { | |
cout<<"\007"; | |
Sleep(1000); | |
} | |
} | |
} |
# 對象的宣告與引用
# 對象的宣告
用已定義的類去聲明對象 (即變量),類似於結構體。
宣告對象的一般形式 (類的實例化):
<類名> <對象1>, <對象2>, …… ; | |
// 如 | |
Clock XJTU_Big_Ben, Omega, Rossini; |
# 對象的引用
對象的引用類似於結構體
對類中成員的訪問,採用 .
運算符
Rossini.Set(8,32,53,1000); | |
Rossini.Show_Time(); |
一般在類體外,只有公有成員可以採用 .
運算符訪問
私有、保護成員都不能採用 .
運算符訪問
可以直接進行對象賦值
Omiga=Rossini; |
# 引用對象應該注意
- 成員函數直接訪問同類中的數據成員 (公有和私有)
- 對象訪問其數據成員或成員函數需使用運算符
.
- 禁止直接訪問一個對像中的私有成員
- 同類對象之間可以整體賦值
- 對象用作函數的參數時屬於賦值調用
- 對象可以用作函數值類型,函數可以返回一個對象
# 小結
- 公有成員:外界能夠直接訪問,起著接口的作用
- 私有成員:外界不能直接訪問,使得成員被隱藏起來
- 一個實體的屬性往往被定義為私有成員,方法被定義為公有成員
- 通過類中提供的函數對類中的數據進行操作,達到數據的安全性
- 類名、各成員名稱要符合標識符規範
- 成員函數可在類中定義,也可在類外定義
- 各成員的訪問權限應根據實際需要確定
- 書寫順序任意,有時 public 放在前邊,有時寫幾個 public 或幾個 private
- 類中的數據成員不能使用表達式進行初始化
# 公有、私有和保護成員
# 公有成員
在 public
後面定義的數據成員和函數成員都稱作公有成員
public: | |
char name[10]; | |
int min(int a, int b); |
外界 (類外) 能夠直接訪問該成員,通過 .
運算符
一般函數成員被定義為公有成員
通過調用公有函數成員實施規定的操作
外界與類之間起著接口的作用
例如:鐘錶類中的設置函數 set(int,int,int,float)
就定義成公有成員。
class Clock { | |
public: | |
void set(int h,int m,int s,float p) { | |
// 對小時、分鐘、秒鐘的值進行有效性檢驗後,再賦值 | |
Hour=h>=0&&h<=24?h:0; | |
Minute=m>=0&&m<=60?m:0; | |
Second=s>=0&&s<=60?m:0; Price=p; | |
} | |
}; // 分號別忘 | |
Clock XJTU; | |
XJTU.set(11,23,25,1000); // 正確 |
# 私有成員
在 private
後面定義的數據成員和函數成員都稱作私有成員
private: | |
int age; | |
int max(int a, int b); |
外界 (類外) 不能夠直接訪問該成員
一般數據成員被定義為私有成員
使得成員被封裝隱藏起來,外界不能隨便修改對象的私有數據成員
只有通過類中公有函數對數據進行修改,達到數據的安全性
例如:鐘錶類的時分秒定義為私有成員,通過 set()
函數才能修改。
class Clock | |
{ | |
private: | |
int Hour,Minute,Second; | |
float Price; | |
public: | |
void set(int h,int m,int s,float p); | |
…… | |
}; | |
Clock XJTU; | |
XJTU.Hour=10; // 錯誤 |
# 保護成員
在 protected
後面定義的數據成員和函數成員都稱作保護成員
protected: | |
float price; | |
int abs(int a); |
外界部分區域能夠訪問該成員
換句話說某些數據或函數成員在類外被有限制的訪問
私有是對外界完全封閉,公有是完全開放,保護是介於兩者之間
例如:下面有兩個類的定義,一個是時間類,一個是日期類
class time | |
{ | |
private: | |
int hour,minute; | |
protected: | |
int second; | |
…… | |
}; | |
class date:public time | |
{ | |
private: | |
int year,month,day; | |
public: | |
void show_date_time() | |
{ | |
cout<<year<<'-'<<month<<'-'<<day<<'\t'; | |
cout<<hour<<'-'<<minute<<'-'<<second<<endl; | |
//hour 報錯 minute 報錯 second 正確 | |
} | |
…… | |
}; |
# 兩種程式設計思想
# 面向過程的程序設計 (Structured Programming)
以功能為中心,通過分解功能,採用函數來描述操作
數據與函數分離,數據(類型或結構)一旦發生改變,函數也要相應改變
例如排序函數: void sort(int a[],int n);
只能排序整數陣列
# 面向對象程序設計(Object Oriented Programming)
以數據為中心,採用對象來描述內部屬性和操作方法
將數據和函數當作一個統一體,採用軟件對像模擬客觀世界中實際對象
例如:鐘錶類、日期類
- 特徵:
- 抽象:實體特徵 + 實體功能
如鐘錶、日期、分數等實體的抽象描述 - 封裝:數據和函數封裝組成統一體
通過公有成員函數修改數據、顯示數據、取得數據 - 繼承:將對象 (實體) 之間的差異通過繼承性加以抽象描述
動物
→{人、大象、鳥…}
→{學生、工、農、兵…}
→ - 多態性:指相同語法結構(數據或操作)代表多種功能
如+
、-
、*
、/
- 抽象:實體特徵 + 實體功能
- 優點:
- 開發時間短,效率高,可靠性高
- 重用,共享,可維護性,精簡
- 適合於大型程序長時間的團隊開發工作