什么是面向?qū)ο螅?/h1>
來源:菜鳥教程、立功科技、百度百科
面向?qū)ο?/a>&&面向過程
1、什么是面向過程編程?
比較官方的解釋就是:“面向過程”(Procedure Oriented)是一種以過程為中心的編程思想。這些都是以什么正在發(fā)生為主要目標(biāo)進(jìn)行編程,不同于面向?qū)ο蟮氖钦l(shuí)在受影響。C語(yǔ)言就是一門面向過程的語(yǔ)言。
2、什么是面向?qū)ο缶幊蹋?/h3>
比較官方的解釋就是:面向?qū)ο蟪绦蛟O(shè)計(jì)(Object Oriented Programming,OOP)是一種計(jì)算機(jī)編程架構(gòu)。OOP的一條基本原則是計(jì)算機(jī)程序由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成。
OOP達(dá)到了軟件工程的三個(gè)主要目標(biāo):重用性、靈活性和擴(kuò)展性。OOP=對(duì)象+類+繼承+多態(tài)+消息,其中核心概念是類和對(duì)象。C++就是一門面向?qū)ο蟮恼Z(yǔ)言。
3、例子
假如要乘出租車去機(jī)場(chǎng)。
面向過程的方式是:告訴司機(jī),按照啟動(dòng)、右轉(zhuǎn)、左轉(zhuǎn)、停止
等單獨(dú)的接口去機(jī)場(chǎng)。這種方式需要乘客對(duì)自己的行為負(fù)責(zé),乘客需要知道每個(gè)城市去機(jī)場(chǎng)的路線。
面向?qū)ο蟮姆绞绞牵?/strong>告訴司機(jī),請(qǐng)載我去機(jī)場(chǎng)
。顯然這種方法比面向過程的方法要容易得多。
在面向過程編程時(shí),由于主程序承擔(dān)的責(zé)任太多,要確保一切正確工作,還要協(xié)調(diào)各個(gè)函數(shù)并控制它們的先后順序,因此經(jīng)常會(huì)產(chǎn)生非常復(fù)雜的代碼。
很多時(shí)候變化是不可避免的,而功能分解法(面向過程思想)卻又無(wú)法應(yīng)對(duì)可能出現(xiàn)的變化。一旦修改代碼,則bug越來越多。
因此,面對(duì)復(fù)雜的軟件開發(fā)時(shí),主程序不能做太多的事情,必須通過分離關(guān)注點(diǎn)
進(jìn)行職責(zé)轉(zhuǎn)移。
在上面的例子中,盡管具體實(shí)現(xiàn)在廣州、北京或上海等不同城市中是不同的,但在任何城市都可以這么說,因?yàn)樗緳C(jī)知道怎么去機(jī)場(chǎng),這就是職責(zé)轉(zhuǎn)移
。
面向?qū)ο蟪绦驅(qū)嵗?/span>
因?yàn)镃++是一門面向?qū)ο蟮恼Z(yǔ)言,所以C++ 完全支持面向?qū)ο蟮某绦蛟O(shè)計(jì),包括面向?qū)ο?/a>開發(fā)的四大特性:封裝、抽象、繼承、多態(tài)
。
1、一些基本概念
-
類 - 類可以定義為描述對(duì)象行為/狀態(tài)的模板/藍(lán)圖。 -
對(duì)象 - 對(duì)象具有狀態(tài)和行為。例如:一只狗的狀態(tài) - 顏色、名稱、品種,行為 - 搖動(dòng)、叫喚、吃。對(duì)象是類的實(shí)例。 -
方法 - 從基本上說,一個(gè)方法表示一種行為。一個(gè)類可以包含多個(gè)方法。可以在方法中寫入邏輯、操作數(shù)據(jù)以及執(zhí)行所有的動(dòng)作。
2、類 && 對(duì)象
代碼:
#include <iostream>
using namespace std;
/* Box類 */
class Box
{
public:
double length; // 長(zhǎng)度
double breadth; // 寬度
double height; // 高度
};
int main( )
{
Box Box1; // 聲明 Box1,類型為 Box
Box Box2; // 聲明 Box2,類型為 Box
double volume = 0.0; // 用于存儲(chǔ)體積
// Box1對(duì)象
Box1.height = 5.0;
Box1.length = 6.0;
Box1.breadth = 7.0;
// Box2對(duì)象
Box2.height = 10.0;
Box2.length = 12.0;
Box2.breadth = 13.0;
// box 1 的體積
volume = Box1.height * Box1.length * Box1.breadth;
cout << "Box1 的體積:" << volume <<endl;
// box 2 的體積
volume = Box2.height * Box2.length * Box2.breadth;
cout << "Box2 的體積:" << volume <<endl;
return 0;
}
運(yùn)行結(jié)果:
3、繼承
當(dāng)創(chuàng)建一個(gè)類時(shí),您不需要重新編寫新的數(shù)據(jù)成員和成員函數(shù),只需指定新建的類繼承了一個(gè)已有的類的成員即可。這個(gè)已有的類稱為基類,新建的類稱為派生類。
繼承代表了 is a 關(guān)系。例如,哺乳動(dòng)物是動(dòng)物,狗是哺乳動(dòng)物,因此,狗是動(dòng)物,等等。
代碼:
#include <iostream>
using namespace std;
// 基類
class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
// 派生類
class Rectangle: public Shape
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// 輸出對(duì)象的面積
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}
運(yùn)行結(jié)果:
這里只是演示了最基本的一個(gè)繼承的例子,關(guān)于C++繼承相關(guān)的還有公有繼承(public)、保護(hù)繼承(protected)、私有繼承(private)、多繼承等知識(shí)點(diǎn),大家可以自己去學(xué)習(xí)。
4、多態(tài)
多態(tài)
按字面的意思就是多種形態(tài)。C++ 多態(tài)意味著調(diào)用成員函數(shù)時(shí),會(huì)根據(jù)調(diào)用函數(shù)的對(duì)象的類型來執(zhí)行不同的函數(shù)。
下面的實(shí)例中,基類 Shape 被派生為兩個(gè)類,如下所示:
#include <iostream>
using namespace std;
// 基類
class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
virtual int area()
{
cout << "Parent class area :" <<endl;
return 0;
}
};
// 派生類Rectangle
class Rectangle: public Shape{
public:
Rectangle( int a=0, int b=0):Shape(a, b) { }
int area ()
{
cout << "Rectangle class area :" <<endl;
return (width * height);
}
};
// 派生類Triangle
class Triangle: public Shape{
public:
Triangle( int a=0, int b=0):Shape(a, b) { }
int area ()
{
cout << "Triangle class area :" <<endl;
return (width * height / 2);
}
};
// 程序的主函數(shù)
int main( )
{
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);
// 存儲(chǔ)矩形的地址
shape = &rec;
// 調(diào)用矩形的求面積函數(shù) area
shape->area();
// 存儲(chǔ)三角形的地址
shape = &tri;
// 調(diào)用三角形的求面積函數(shù) area
shape->area();
return 0;
}
運(yùn)行結(jié)果:
5、抽象
數(shù)據(jù)抽象
是指,只向外界提供關(guān)鍵信息,并隱藏其后臺(tái)的實(shí)現(xiàn)細(xì)節(jié),即只表現(xiàn)必要的信息而不呈現(xiàn)細(xì)節(jié)。
讓我們舉一個(gè)現(xiàn)實(shí)生活中的真實(shí)例子,比如一臺(tái)電視機(jī),您可以打開和關(guān)閉、切換頻道、調(diào)整音量、添加外部組件(如喇叭、錄像機(jī)、DVD 播放器),但是您不知道它的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),也就是說,您并不知道它是如何通過纜線接收信號(hào),如何轉(zhuǎn)換信號(hào),并最終顯示在屏幕上。
因此,我們可以說電視把它的內(nèi)部實(shí)現(xiàn)和外部接口分離開了,您無(wú)需知道它的內(nèi)部實(shí)現(xiàn)原理,直接通過它的外部接口(比如電源按鈕、遙控器、聲量控制器)就可以操控電視。
代碼:
#include <iostream>
using namespace std;
class Adder{
public:
// 構(gòu)造函數(shù)
Adder(int i = 0)
{
total = i;
}
// 對(duì)外的接口
void addNum(int number)
{
total += number;
}
// 對(duì)外的接口
int getTotal()
{
return total;
};
private:
// 對(duì)外隱藏的數(shù)據(jù)
int total;
};
int main( )
{
Adder a;
a.addNum(10);
a.addNum(20);
a.addNum(30);
cout << "Total " << a.getTotal() <<endl;
return 0;
}
6、封裝
數(shù)據(jù)封裝
是一種把數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)捆綁在一起的機(jī)制,數(shù)據(jù)抽象
是一種僅向用戶暴露接口而把具體的實(shí)現(xiàn)細(xì)節(jié)隱藏起來的機(jī)制。
class Box
{
public:
double getVolume(void)
{
return length * breadth * height;
}
private:
double length; // 長(zhǎng)度
double breadth; // 寬度
double height; // 高度
};
變量 length、breadth 和 height 都是私有的(private)。這意味著它們只能被 Box 類中的其他成員訪問,而不能被程序中其他部分訪問。這是實(shí)現(xiàn)封裝的一種方式。
猜你喜歡
C語(yǔ)言、嵌入式重點(diǎn)知識(shí):回調(diào)函數(shù)
深度實(shí)踐嵌入式調(diào)試神器MicroLab
免責(zé)聲明:本文來源網(wǎng)絡(luò),免費(fèi)傳達(dá)知識(shí),版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請(qǐng)聯(lián)系我進(jìn)行刪除。
為了便于公眾號(hào)讀者交流學(xué)習(xí),小編創(chuàng)建了相關(guān)相關(guān)交流群??游挥邢蓿信d趣的朋友可以掃碼下方二維碼加我微信,由我邀請(qǐng)入群:
歡迎大家進(jìn)群交流、共同進(jìn)步。同時(shí),我也會(huì)關(guān)注一些大家問的一些問題,從中挑選一些具有代表性的、并且在我知識(shí)范圍內(nèi)的問題寫出相關(guān)文章做分享。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!