面向?qū)ο缶幊蹋ㄒ唬?/strong>
一、面向?qū)ο缶幊探榻B
(一)什么是面向?qū)ο螅?/strong>
面向?qū)⑾到y(tǒng)看成通過交互作用來完成特定功能的對象的集合。每個對象用自己的方法來管理數(shù)據(jù)。也就是說只有對象內(nèi)部的代碼能夠操作對象內(nèi)部的數(shù)據(jù)。
(二)面向?qū)ο蟮膬?yōu)點
·面向過程的缺點
不容易維護,靈活性差,不容易擴展,更談不上復(fù)用,由于客戶的需求多變,導(dǎo)致程序員加班加點,甚至整個項目經(jīng)常返工。
·面向?qū)ο蟮膬?yōu)點
通過繼承、封裝、多態(tài)降低程序的耦合度,并結(jié)合設(shè)計模式讓程序更容易修改和擴展,并且容易復(fù)用。
(三)面向?qū)ο蟮奶攸c
抽象、封裝、繼承、多態(tài)
1.抽象:
·抽象是人們認識事物的一種方法
·抓住事物本質(zhì),而不是內(nèi)部具體細節(jié)或者具體實現(xiàn)
2.封裝
·封裝是指按照信息屏蔽的原則,把對象的屬性和操作結(jié)合一起,構(gòu)成獨立的對象。
·通過限制對屬性和操作的訪問權(quán)限,可以將屬性“隱藏”在對象內(nèi)部,對外提供一定的接口,在對象之外只能通過接口對對象進行操作。
·封裝性增加了對象的獨立性,從而保證數(shù)據(jù)的可靠性。
·外部對象不能直接對操作對象的屬性,只能使用對象提供的服務(wù)。
3.繼承
·繼承表達了對對象的一般與特殊的關(guān)系。特殊類的對象具有一般類的全部屬性和服務(wù)。
·當(dāng)定義了一個類后,又需定義一個新類,這個新類與原來的類相比,只是增加或修改了部分屬性和操作,這時可以用原來的類派生出新類,新類中只需描述自己所特有的屬性和操作。
·繼承性大大簡化了對問題的描述,大大提高了程序的可重用性,從而提高了程序設(shè)計、修改、擴充的效率等。
4.多態(tài)
·多態(tài)性:同一個消息被不同對象接收時,產(chǎn)生不同結(jié)果,即實現(xiàn)同一接口,不同方法。
·一般類中定義的屬性和服務(wù),在特殊類中不改變其名字,但通過各自不同的實現(xiàn)后,可以具有不同的數(shù)據(jù)類型或者具有不同的行為。

當(dāng)向圖形對象發(fā)送消息進行繪圖服務(wù)請求后,圖形對象會自動判斷自己的所屬類然后執(zhí)行相應(yīng)的繪圖服務(wù)。
總結(jié):面向?qū)ο缶幊痰膬?yōu)缺點
面向?qū)ο缶幊痰膬?yōu)點:
·易維護:可讀性高,即使改變需求,由于繼承的存在,維護也只是在局部模塊,維護起來是非常方便和較低成本的。
·質(zhì)量高:可重用現(xiàn)有的,在以前的項目的領(lǐng)域中已被測試過的類使系統(tǒng)滿足業(yè)務(wù)需求并具有較高質(zhì)量。
·效率高:在軟件開發(fā)時,根據(jù)設(shè)計的需要對現(xiàn)實世界的事物進行抽象,產(chǎn)生類。這樣的方法解決問題,接近于日常生活和自然的思考方式,勢必提高軟件開發(fā)的效率和質(zhì)量
·易擴展:由于繼承、封裝、多態(tài)的特性,自然設(shè)計出高內(nèi)聚、低耦合的系統(tǒng)結(jié)構(gòu),使得系統(tǒng)更靈活、更容易擴展,而且成本較低。
面向?qū)ο缶幊痰娜秉c:
運行效率會下降10%左右
二、類與對象
(一)類的聲明
//類是一種用戶自定義類型,聲明形式:
class 類名稱
{
public:
公有成員(外部接口)
PRivate:
私有成員
protected:
保護成員
};
例:
#include <iostream> using namespace std; class Test{public:int x_;protected:int y_;private:int z_;}; int main(){Test t;t.x_ = 5;t.y_ = 6; //Error!不可訪問t.z_ = 7; //Error1不可訪問 cout << "t.x: " << t.x_ << endl;return 0;}升級版:
#include <iostream> using namespace std; class Test{public:int x_;void setX(int x){x_ = x;}void setY(int y){y_ = y;}void setZ(int z){z_ = z;}int getX(){return x_;}int getY(){return y_;}int getZ(){return z_;}protected:int y_;private:int z_;}; int main(){Test t;t.x_ = 5; cout << "t.x: " << t.x_ << endl;cout << "t.y: " << t.getY() << endl;cout << "t.z: " << t.getZ() << endl;return 0;}編譯結(jié)果:

PS:y,z未進行初始化所以是亂碼。
(二)public、private、protected
·在關(guān)鍵字public后面聲明,它們是類與外部的接口,外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。
·在關(guān)鍵詞private后面聲明,只允許本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。
·在關(guān)鍵詞protected后面聲明,與private類似,其差別表現(xiàn)在繼承與派生時對派生類的影響不同。
(三)成員函數(shù)
1.類內(nèi)實現(xiàn)成員函數(shù)
函數(shù)類內(nèi)實現(xiàn)默認為inline函數(shù),占用空間,所有一般類外實現(xiàn)函數(shù)
上述例題中函數(shù)為類內(nèi)實現(xiàn)
2.類外實現(xiàn)成員函數(shù)
例:
Test.h #ifndef _TEST_H_ #define _TEST_H_ class Test { public: int x_; void initXYZ(int x, int y, int z); void display(); protected: int y_; private: int z_; };#endifTest.c: #include "Test.h" #include <iostream> using namespace std; void Test::initXYZ(int x, int y, int z) { x_ = z; y_ = y; z_ = x; } void Test::display() { cout << "x:" << x_ << "/t" << "y:" << y_ << "/t" << "x:" << z_ << "/t" << endl; }lei.c:#include <iostream>#include "Test.h" using namespace std; int main(){Test t; t.initXYZ(1, 2, 3);t.display(); return 0;}運行結(jié)果:


3.成員函數(shù)的重載及默認參數(shù)
(四)class VS struct
class數(shù)據(jù)成員默認私有
struct數(shù)據(jù)成員默認公有
例:
#include <iostream> using namespace std; class Test{public:int x_;int y_;int z_;};struct Test1{int x_;int y_;int z_; void initXYZ(int x, int y, int z){x_ = x;y_ = y;z_ = z;}};int main(){Test t1;t1.x_ = 5; Test1 t2;t2.initXYZ(1, 2, 3); cout << "t1:" << t1.x_ << endl;cout << "t2:" << t2.x_ << endl; cout << sizeof(t1) << endl;cout << sizeof(t2) << endl; return 0; }運行結(jié)果:

C++編譯器對struct升級:
在結(jié)構(gòu)體內(nèi)可以加入函數(shù)
由運行結(jié)果可知:
·類的大小與成員函數(shù)無關(guān),只與成員有關(guān)
·對齊方式與大小與結(jié)構(gòu)體一樣
·對象的大小由成員決定
·方法是共享的
(五)對象的存儲類型

代碼驗證:
#include <iostream>using namespace std; class Test{private:int x_;int y_;int z_;public:void initXYZ(int x, int y, int z){this->x_ = x;this->y_ = y;this->z_ = z;}};int main(){Test *t1 = new Test();t1->initXYZ(1, 2, 4); return 0;}調(diào)試結(jié)果:

(六)類的作用域
前向聲明:只能定義指針或者引用,不能有另一個類的對象
代碼示例:
A.h#ifndef _A_H_#define _A_H_ class B;//前向聲明 class A{public:A();~A();private:B *b; //B &b};#endifB.h#ifndef _B_H_#define _B_H_ class B{public:B();~B();};#endifA.cpp#include "A.h"#include <iostream> using namespace std; A::A(){cout << "init A!" << endl;}A::~A(){cout << "destory A!" << endl;}B.cpp#include "B.h"#include <iostream> using namespace std; B::B(){cout << "init B!" << endl;}B :: ~B(){cout << "destory B!" << endl;}main.c#include <iostream>#include "A.h"#include "B.h" int main(){return 0;}編譯結(jié)果:

(七)嵌套類(內(nèi)部類)
·從作用域的角度看,嵌套類被隱藏在外圍類中,該類名只能在外圍類中使用。如果
在外圍類的作用域使用該類名時,需要加名字限定
·嵌套類中的成員函數(shù)可以在它的類體外定義
·嵌套類的成員函數(shù)對外圍類的成員沒有訪問權(quán),反之亦然。
·嵌套類僅僅只是語法上的嵌入
(八)局部類
·類也可以定義在函數(shù)體內(nèi),這樣的類被稱為局部類(local class)。局
部類只在定義它的局部域內(nèi)可見
·局部類的成員函數(shù)必須被定義在類體中。
·局部類中不能有靜態(tài)成員
代碼示例:
#include <iostream> using namespace std; class Test{public: int x_; class Inner //嵌套類 { public: int num; void func(); }; void setX(int x) { x_ = x;display(); } void setY(int y) {y_ = y;display(); } void setZ(int z) { z_ = z; } int getX() { return x_; } int getY() { return y_; } int getZ() { return z_; } protected: int y_; void display() { cout << x_ << y_ << z_ << endl; } private: int z_;}; void Test::Inner::func(){ cout << "hello world" << endl;} int main() { class LocalClass //局部類 { void func(){ } } Test t; Test::Inner n; t.x_ = 6; t.setY(6); t.setZ(7); cout << "t.y_ = " << t.getY() << endl; cout << "t.z_ = " << t.getZ() << endl; cout << "t.x_ = " << t.x_ << endl; return 0;}
新聞熱點
疑難解答
圖片精選