C++編程入門系列之十二(類與對象:面向對象設計的基本思想和特點)
上一講雞啄米講了函數重載和函數模板以後,C++和C語言相似的語法就剩下後面要講的數組了,這一講開始雞啄米就要講C++所特有的一些概念和思想了。本節編程入門教程主要講面向對象程序設計的基本思想和特點。另外,說明一點,以後雞啄米會加一個大的教程分類,讓大家更好的對瑣碎的知識進行分類,比如這一講的大的分類叫“類與對象”,標題是面向對象設計的基本思想和特點。
在編程入門教程的前言中,雞啄米已經簡單講到了面向對象程序設計的幾個基本概念,這一講將做更深入的討論。
計算機技術飛速發展,軟件開發技術也同樣經歷了各種各樣的變化,從早期的面向過程的結構化程序設計,到面向對象的程序設計,其實都是在尋找一種更能夠提高可擴展性和可複用性的程序設計方法,這樣才能更大限度的提高軟件開發效率。現在的面向對象程序設計方法(OOP)通過抽象、封裝、繼承等手段,已經成爲目前最能提高可擴展性和可複用性的程序設計方法,能夠最大限度的提高軟件生產能力,降低軟件開發和維護的費用。
在面向對象程序設計方法之前普遍使用的是面向過程的結構化程序設計方法,它的主要思想就是,將一個複雜問題根據功能等分成一個個子問題,然後再接着細分,直到分解成具體的語句,這種方法固然有很多優點,但是有個比較大的缺點就是,這種方法中數據和函數是分開的,如果我們要修改數據結構,則有關的函數都必須修改,這樣不但維護成本比較大,而且很容易遺漏一些應該修改的地方。
面向對象程序設計方法是對面向過程程序設計方法的繼承和發展。這種程序設計方法認爲,現實世界是由一些互相關聯的實體組成的,這些實體就是面向對象方法中的對象,而對一些對象的共性的抽象描述,就是面向對象程序設計方法中最核心的概念–類。面向對象的程序設計方法就是運用面向對象的思維來描述現實問題,再用計算機語言解決該問題,這裏的解決就是靠類和對象實現的,是對現實問題的高度概括、分類和抽象。
雞啄米下面講下面向對象程序設計方法的基本特點:抽象、封裝、繼承和多態。
1.抽象
面向對象方法中的抽象是指對具體問題即對象進行概括,抽出一類對象的共性並加以描述的過程。面向對象的軟件開發中,首先應該對要解決的問題抽象成類,然後纔是解決問題的過程。抽象有兩個方面:數據抽象和行爲抽象。數據抽象是描述某類對象的屬性或狀態,行爲抽象是描述某類對象的共同行爲或共同功能。
雞啄米就拿時鐘給大家舉個例子,要實現有關時鐘的程序,首先要對時鐘進行抽象。時鐘有時、分、秒,我們用三個整型變量來存儲,這就是數據抽象。時鐘有顯示時間和設置時間等功能,這就是行爲抽象。用C++語言描述就是:
時鐘(Clock):
數據抽象:
int Hout; int Minute; int Second;
行爲抽象:
ShowTime(); SetTime();
上面並不是真正的C++代碼,只是簡單的列出了數據成員和函數成員的代碼片段。
2.封裝
把抽象出來的數據成員和函數成員結合形成一個整體,就是封裝。封裝的時候,我們可以把一些成員作爲類和外界的接口,把其他的成員隱藏起來,以達到對數據訪問權限的控制,這樣可以使程序的各個部分改變時最低程度的影響其他部分,程序會更安全。
把數據和函數封裝爲一個可複用的模塊,開發時可以利用已有的成果而不必每次都重複編寫。我們只需要通過類提供的外部接口訪問模塊,並不需要知道內部的細節。C++中就是利用類的形式來實現封裝的。
下面是雞啄米上面提到的時鐘的具體封裝形式及時鐘類:
class Clock // class是關鍵字 Clock是類名
{
public: // 提示下面是外部接口
void SetTime(int NewH,int NewM,int NewS); // 行爲,函數成員
void ShowTime(); // 行爲,函數成員
private: // 特定的訪問權限
int Hour,Minute,Second; // 屬性,數據成員
};
這是一個完整的類的聲明。它聲明瞭一個名爲Clock的類,其中的數據成員和函數成員是前面分析得到的抽象結果。關鍵字public和private是用來指定成員的不同訪問權限的,至於具體訪問權限的問題後面課程中會講到。聲明爲public的兩個函數爲類提供了外部接口,外界只能通過這兩個接口跟Clock類聯繫。聲明爲private的三個整型數據是類的私有數據,外部無法直接訪問。我們可以看到,這種訪問權限的機制有效實現了對數據的隱藏。
3.繼承
我們在軟件開發過程中,可能已經有了前人的一些現有的成果,我們沒有必要再重新去編寫,那麼我們怎樣利用這些已有的模塊呢?還有可能我們對以前寫的程序有了更新的認識,需要融入一些新的認識,那怎麼辦呢?
這些都可以通過繼承來實現,C++語言提供了類的繼承機制,讓我們軟件開發者可以在保持原有特性的基礎上,進行更具體、更詳細的說明。通過繼承我們可以利用之前已經有的程序模塊,還可以添加一些新的數據和行爲,這在很大程度上提高了程序的複用性,大大節約開發成本。關於繼承,後面的課程也會具體講。
4.多態
多態就是類中具有相似功能的不同函數使用同一個名稱。上一講中講的重載函數就實現了多態。利用多態可以對類的行爲再抽象,抽象成同一個名稱的功能相似的函數,減少程序中標識符的個數。多態是通過重載函數和虛函數等技術來實現的,虛函數後面也會詳細介紹。
這一講雞啄米認爲,是屬於軟件開發思想方面的東西,在編程入門時可能不是很好理解,但是大家能掌握多少就儘量掌握吧,在以後大家真的實踐了一些方法再來理解的話就很簡單了,一句話,不要認爲它有多難!
思考:
- 對車進行數據抽象和行爲抽象
- 封裝的意義?
- 多態是通過什麼實現的?
- 面向對象的基本特點?
本文轉自我崇拜的技術大牛雞啄米