# 實體、對象與類的概念

# 實體

# 什麼是實體?

是指客觀世界存在的某個事物

一所大學,例如:西安交通大學
某動物,例如:一隻羊
一本圖書,例如:《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)

以數據為中心,採用對象來描述內部屬性和操作方法
將數據和函數當作一個統一體,採用軟件對像模擬客觀世界中實際對象
例如:鐘錶類、日期類

  • 特徵:
    • 抽象:實體特徵 + 實體功能
      如鐘錶、日期、分數等實體的抽象描述
    • 封裝:數據和函數封裝組成統一體
      通過公有成員函數修改數據、顯示數據、取得數據
    • 繼承:將對象 (實體) 之間的差異通過繼承性加以抽象描述
      動物
      →{人、大象、鳥…}
      →{學生、工、農、兵…}
    • 多態性:指相同語法結構(數據或操作)代表多種功能
      +-*/
  • 優點:
    • 開發時間短,效率高,可靠性高
    • 重用,共享,可維護性,精簡
    • 適合於大型程序長時間的團隊開發工作
更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay