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