面向对象的程序设计席卷了整个软体界_第1页
面向对象的程序设计席卷了整个软体界_第2页
面向对象的程序设计席卷了整个软体界_第3页
面向对象的程序设计席卷了整个软体界_第4页
面向对象的程序设计席卷了整个软体界_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 面向对象的程序设计席捲了整個軟体界c+是一个应用最广泛的面向对象的程序设计语言它有几个特点:封裝、继承、虚拟与多态 1 類別及其成員- 封裝(encapsulation)讓我們把世界看成是一個由object所組成的大環境。Object就是東西,目标、对象。 任何實际的物体你都可以說它是object。為了描述object,我們應該先把object的屬性描述出來。object的屬性就是類別(class)。class有兩大成員,一是資料(member variable成员变量),一是行為(method:member function)。一般而言,成員变量通常由成員函数處理的。如果我以CSquare

2、 代表四方形這種類別,四方形有color,四方形可以display。color 就是一種成員变量,display 就是一種成員函数:CSquare square; / 宣告square 是一個四方形类变量。square.color = RED; / 設定成員变量。RED 代表一個顏色值。square.display(); / call成員函数。下面是C+ 語言對於CSquare 的描述:class CSquare / 常常我們以C 作為類別名稱的開頭private:int m_color; / 通常我們以m_ 作為成員变量的名稱開頭public:void display() . void se

3、tcolor(int color) m_color = color; ;成員变量可以只在類別內被處理,也可以開放給外界處理。成員变量被封裝在类内是为了安全,但有時候也不得不開放。为此,C+ 提供了private、public 和protected 三種修飾詞。一般而言成員变量尽量宣告為private,成員函数則通常宣告為public。上例的m_color 既然宣告為private,我們需要编写一个成員函数setcolor,供外界設定顏色用,它应该是publi的c。把資料(变量)宣告為private,不允許外界隨意存取,只能类自己來操作,這就是面向对象的封裝(encapsulation)特性。2

4、 基类,派生类:继承性 (Inheritance)C+ 神秘而特有的性質其實在於继承。矩形是形,橢圓形是形,三角形也是形。可以把相同的性質抽取出來,成立一個基礎類別(base class),再從中派生出派生類別(derived class)。所以,關於形狀,我們就有了类的阶层阶层: 注意:基类,派生类的關係是“IsKindOf” 的關係。也就是說,Circle是一種Ellipse,Ellipse是一種Shape;Square是一種Rectangle,Rectangle是一種Shape。 class CShape / 形狀 private: int m_color; public: void s

5、etcolor(int color) m_color = color; ; class CRect : public CShape / 矩形是一種形狀 /它会继承m_color 和setcolor() public: void display() . ; class CEllipse : public CShape / 橢圓形是一種形狀 /它会继承m_color 和setcolor() public: void display() . ; class CTriangle : public CShape / 三角形是一種形狀 /它会继承m_color 和setcolor() public: vo

6、id display() . ; class CSquare : public CRect / 四方形是一種矩形 public: void display() . ; class CCircle : public CEllipse / 圓形是一種橢圓形 public: void display() . ;於是你可以编写這样的程序:CSquare square;CRect rect1, rect2;CCircle circle;square.setcolor(1); / 令square.m_color = 1;square.display(); / call CSquare:displayrec

7、t1.setcolor(2); / 於是rect1.m_color = 2rect1.display(); / call CRect:displayrect2.setcolor(3); / 於是rect2.m_color = 3rect2.display(); / call CRect:displaycircle.setcolor(4); / 於是circle.m_color = 4circle.display(); / call CCircle:display注意以下這些事實與問題:1. 所有類別都由CShape 派生下來,所以它們都自然而然继承了CShape 的成員,包括变量和函数。也就是

8、說,所有的形狀類別都具備了m_color 变量,和setcolor 函数(方法)。2. 兩個矩形object rect1 和rect2 各有自己的m_color,但關於setcolor 函数卻是共用相同的CRect:setcolor(其實更應該說是CShape:setcolor)。我用這張圖表示其間的關係: 一個問題:同一个函数如何處理不同的資料(变量)?為什麼rect1.setcolor 和rect2.setcolor 明明都是call CRect:setcolor,卻能夠有條不紊地分別處理rect1.m_color 和rect2.m_color?答案在於所謂的this 指针。3. 既然所有

9、類別都有display 動作(但显示不同的形狀),把它提升到老祖宗基类CShape 去,然後再继承之,好嗎? 4. 如果display 不能提昇到基礎類別去,我們就不能夠以一個for 迴路或while迴路乾淨漂亮地完成下列動作(此種動作模式在object導向程序的方法中重要無比):CShape shapes5;. / 令5 個shapes 各為矩形、四方形、橢圓形、圓形、三角形for (int i=0; i<5; i+)shapesi.display;一个语言的語法应该支援把所有形狀(不管什麼形狀)都display 出來的统一的操作,否则是失敗的語言。C+ 是成功的。this 指针剛剛我

10、才說過,兩個矩形object rect1 和rect2 各有自己的m_color 成員变量,但rect1.setcolor 和rect2.setcolor 卻都调用唯一的CRect:setcolor 成員函数。那麼CRect:setcolor 如何處理不同object中的m_color?答案是:成員函数有一個隱藏參數,名為this 指针。當你call:rect1.setcolor(2); / rect1 是CRect objectrect2.setcolor(3); / rect2 是CRect object編译器實際上為你做出來的代碼是:CRect:setcolor(2, (CRect*)&

11、amp;rect1);CRect:setcolor(3, (CRect*)&rect2);不過,由於CRect 本身並沒有宣告setcolor,它是從CShape 繼承來的,所以編譯器實際上產生的碼是:CShape:setcolor(2, (CRect*)&rect1);CShape:setcolor(3, (CRect*)&rect2);多出來的參數,就是所謂的this 指针。至於類別之中,成員函数的定義:class CShape.public:void setcolor(int color) m_color = color; ;被編譯器整治過後,其實是:class CShape.public:void setcolor(int color, (CShape*)this) this->m_color = color; ;虛虚拟与多态 (Polymorphism)我曾經說過,前一個例子沒有辦法完成這樣的動作:CShape shapes5;. / 令5 個shapes 各為矩形、四方形、橢圓形、圓形、三角形for (int i=0; i<5; i+)shapesi.display;可是這種所謂object操作的统一化的操作,在applica

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论