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