本篇,來介紹面向?qū)ο蟮幕靖拍睢?/p>
1 面向過程與面向?qū)ο?/h2>
面向過程與面向?qū)ο?,是兩種不同的編程思想。
1.1 面向過程
面向過程的思路,是按照問題的解決步驟,將程序分解為一個個具體的函數(shù)或過程,然后依次調(diào)用這些函數(shù)來實現(xiàn)程序的功能。
面向?qū)ο蟮某绦蛟O(shè)計,程序的執(zhí)行流程比較直觀,按照步驟一次執(zhí)行,適合處理簡單的,單線程的任務(wù)。
1.2 面向?qū)ο?/h3>
面向?qū)ο蟮乃悸罚菍⑹挛锍橄蟪蓪ο?,每個對象有自己的屬性(變量)和方法(函數(shù))。對象是程序的基本單元,通過對象之間的交互、消息傳遞等來實現(xiàn)程序的功能。
2 對象的概念
2.1 對象數(shù)據(jù)
保存在對象中的數(shù)據(jù),描述了該對象的狀態(tài)。在面向?qū)ο笾?,?shù)據(jù)被稱為屬性。
例如,一個員工的屬性,可以包含員工號、生日、性別、電話號碼等。
2.2 對象行為
對象的行為,表示這個對象可以做什么。在面向?qū)ο笾?,?shù)據(jù)被稱為方法。
例如,員工對象的方法,可以有setGender()和getGender()來設(shè)置和獲取性別。
3 類的概念
3.1 類與對象
類可以理解為對象的藍圖。在實例化一個對象時,是基于這個類來構(gòu)建對象。
類也可以理解為是對象的模板或模具,用來創(chuàng)建對象。
例如,創(chuàng)建一個整數(shù)或浮點數(shù):
int x;
float y;
也可以使用自定義的類來創(chuàng)建對象
myClass myObject;
3.2 類的屬性、方法和消息
以一個Person類為例來介紹:
class Person{
// 屬性
private:
std::string name;
std::string address;
// 方法
public:
std::string getName(){
return name;
}
std::string setName(std::string n){
name = n;
}
std::string getAddress(){
return address;
}
std::string setAddress(std::string adr){
address = adr;
}
}
3.2.1 屬性
類的數(shù)據(jù)通過屬性來表示,用來存放該類實例化的每個對象的狀態(tài)
屬性可以有3種類型:
public: 其它對象可以訪問private: 只有自身對象可以訪問protected: 只允許相關(guān)對象訪問
3.2.2 方法
方法實現(xiàn)了一個類需要的行為。
在Person類中,方法有g(shù)etName()、getName()、getAddress()、setAddress()。
通過方法來檢查或修改對象的屬性,是面向?qū)ο笾谐S玫募夹g(shù)。
3.2.3 消息
消息是對象之間的通信機制。
當(dāng)對象A調(diào)用了對象B的一個方法,則表示對象A正在向?qū)ο驜發(fā)送一個消息,對象B的響應(yīng)即為其返回值。
class Payroll{
std::string name;
Person p = new Person();
p.setName("Joe");
//...
name = p.getName();
}
3.3 類的可視化描述——UML與類圖
統(tǒng)一建模語言UML(Unified Modeling Language)是一種可視化建模工具,其中的UML類圖,可以用來描述類的特征。
每個類圖由三部分組成:類名、屬性(數(shù)據(jù))和方法(行為)。
類圖中:
- 加號(+)表示公有訪問減號(-)表示私有訪問井號(#)表示保護訪問
4 面向?qū)ο蟮奶匦?/h2>
經(jīng)典的面向?qū)ο螅瑩碛腥筇匦裕?a class="article-link" target="_blank" href="/baike/492719.html">封裝(encapsulation)、繼承(inheritance)和多態(tài)(polymorphism)。除此之外,面向?qū)ο筮€會加入“組合”的特性。
4.1 封裝
封裝是指把對象的屬性和方法進行封裝,對外隱藏其內(nèi)部的實現(xiàn)細節(jié)。
使用對象的好處之一,是無須對外暴露其所有的屬性和方法。
一個好的設(shè)計,是僅暴露出必要的接口來與其它對象進行交互。
4.1.1 接口與實現(xiàn)
接口定義了對象之間的通信方式。實現(xiàn)是具體功能的實現(xiàn)過程。
用戶通過類的接口與對象交互時,只需要關(guān)注接口的形式,無需關(guān)注(也不應(yīng)該看到)對象的內(nèi)部實現(xiàn)。
4.1.2 舉例
一個計算整數(shù)的平方的例子:
class IntSquare{
// 私有屬性
private:
int squareValue;
// 公共接口
public:
int getSquare (int value){
squareValue = calculateSquare(value);
return squareValue;
}
// 私有實現(xiàn)
private:
int calculateSquare(int value){
return value*value;
}
}
該類中,外部對象唯一能訪問的,就是公共接口getSquare(),其余的私有屬性squareValue以及私有方法calculateSquare,外部對象無需知道這些私有屬性和方法的存在。
4.2 繼承
繼承是指一個類可以繼承另一個類的屬性和方法。
可以通過提取公共屬性和方法來創(chuàng)建新類。
例如:有一個貓類(Cat)和一個狗類(Dog),這兩個類都有一個屬性可以表示眼睛的顏色。在面向?qū)ο笾校梢詫㈩伾珜傩陨弦频矫麨椴溉閯游锏念愔校∕ammal)。
4.2.1 超類和子類
- 超類:也稱父類、基類。它包含了所有子類的公共屬性和行為。使用基類的好處在于,通過繼承基類,減少了大量重復(fù)的工作。子類:即超類的衍生類,是超類的擴展
4.2.2 抽象
在實現(xiàn)了哺乳動物類和貓、狗類后,還可以添加其它哺乳動物(老虎、獅子),也可以將貓類作為父類,繼續(xù)擴展出不同品種的貓(波斯貓、加菲貓)
4.2.3 is-a關(guān)系
繼承的關(guān)系,也稱作is-a關(guān)系,例如,貓is a哺乳動物,狗is a哺乳動物。
多重繼承:
多數(shù)編程語言中(Java、.Net、Swift),一個類只有一個父類,一個父類可以有多個子類但在C++中,一個類可以有多個父類,即允許繼承多個父類的功能。
4.3 多態(tài)
多態(tài)與繼承是緊耦合的關(guān)系。
當(dāng)向一個對象發(fā)送消息時,該對象必須定義其實現(xiàn)來響應(yīng)消息。
在繼承的關(guān)系中,子類從父類中繼續(xù)接口,但每個子列又是各有特點的,因此每個子類各自實現(xiàn)對應(yīng)的接口功能,實現(xiàn)獨特的應(yīng)答。
4.4 組合
組合,字母理解,多個對象,組合為一個新的對象,例如,車架、車輪、發(fā)動機等對象組成了汽車對象。
4.4.1 抽象
類比繼承方式,通過組合的方式,也是構(gòu)建對象的一種機制。實際上,構(gòu)建 ? 新類方式,就是繼承和組合這兩種方式。
使用繼承,是把屬性和方法提取到通用的類中。
使用組合,是把類嵌入到其它類中的來構(gòu)造新的類。
4.4.2 has-a關(guān)系
組合的關(guān)系,也稱作has-a關(guān)系,例如,汽車has a發(fā)動機。
5 總結(jié)
本篇介紹了面向?qū)ο蟮囊恍┗靖拍睿敲嫦驅(qū)ο缶幊痰幕A(chǔ)。