張廣梅,朱紅梅
(山東農業大學信息科學與工程學院,泰安271018)
世界編程語言排行榜TIOBE[1]是根據互聯網上有經驗的程序員、課程和第三方廠商的數量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube 統計常用的程序設計語言的排名數據。根據TIOBE[2]公布的數據,C++程序設計語言多年來居于榜單的前三位。
C++程序設計語言是一種面向對象的程序設計語言。相對于結構化的程序設計語言C 語而言,C++程序設計語言具有較強的抽象性[3-4],語言的這一特性,導致學生在學習過程中存在著難以入門的情況。針對這一問題,在教學過程中,需要從面向對象程序分析方法的教學入手,強化面向對象程序設計的基本概念的介紹;在充分介紹面向對象程序設計方法特點的基礎上,再用C++語法來解釋面向對象程序設計中的基本概念,循序漸進,解決C++程序設計語言的入門問題。之后通過案例教學,加強學生對程序設計語言的語法規則的認識,最終使得學生掌握這門語言,達到能用熟練使用該語言進行編程的能力。為更好地向學生滲透面向對象的基本概念,使學生能更好的從結構化程序設計思想過渡到面向對象的程序設計思想,需要加強教學過程中教學案例的設計,通過這些案例,自然而然的將面向對象的各要素融入到課程教學中。下面從面向對象程序設計基本概念教學入手,對C++程序設計語言的教學案例的設計進行探討。
傳統的C++程序設計語言的教學方法是以語法介紹為主,教學內容的組織圍繞著C++程序設計語言的語法特點展開教學內容。從以往的教學過程來看,這種教學模式沒有突出面向對象分析的過程,脫離了面向對象方法的本質,學生不能對面向對象方法有著全面系統的認識,不能很好的完成教學目標。為提升教學效果,要摒棄傳統的以語法為主的教學方法,強化教學案例的設計,從現實案例出發,以案例分析為主,在案例的分析中,逐漸滲透面向對象的基本概念。
面向對象的程序設計方法是當前的主流程序設計方法。面向對象程序設計方法的特點是從現實世界出發分析問題從而自然的解決問題。現實世界是由對象組成,因此面向對象程序設計的關鍵是完成對象的設計。在面向對象應用程序設計中,對象是通過類實例化得到的,由此,自然的引出面向對象程序設計中類的概念。
在面向對象的應用程序中,對象和類之間的關系是具體和抽象之間的關系。類型是對具有相同屬性和行為的對象的抽象,對象是對類的實例化。因此,在面向對象應用程序開發中,首先要進行類的設計,有了類之后,再由類生成對象。因此在對類這一基本概念的教學案例設計中,可以從一個簡單、直觀的對象出發,通過對這一對象的分析,抽象出類的基本要素,完成類的設計。
為闡述類和對象的概念,可以從平面上的點這一對象著手,進行面向對象系統中基本概念的介紹。對于平面上的一個點,是通過其在坐標系中的位置體現出來的,即對于平面上的每個點而言,都有其相應的橫坐標和縱坐標值,可以將這兩個值定義為點對象的數據成員。基于這樣的特點,完成如下類的設計(案例1)。案例1 Pont 類的設計

通過這一案例的設計,完成了類和對象的概念的介紹及類定義的相關C++語法的介紹,可以讓學生對抽象的概念有更直觀的認識,初步建立面向對象分析與設計的理念。
上一節中,通過Point 類的設計,直觀的介紹了類和對象的基本概念。在現實世界中,對象之間存在著包含關系,即,一個對象可以由其他對象組成。例如,要刻畫平面上的一條線段,只需要定義好線段的起點和終點,即可確定平面上的一條線段;要表示平面上的一個三角形,只要定義好平面上的三個頂點即可完成,即一個三角形是由三個點組成。基于現實世界的這種特點,在面向對象程序設計過程中,可以采用類的組合技術很好的將現實世界的這一特色體現出來。為使學生更好地理解面向對象技術的這一機制,在教學案例的設計中,可以在Point 類的基礎上,設計一個三角形類,結合這一教學案例進行類的組合技術的介紹。
根據幾何學的原理,不再一條直線上的三個頂點可以確定一個三角形,對于要設計的三角形類而言,該類包含三個數據成員,分別表示三角形的三個頂點。對三角形這一對象而言,基本的操作的計算周長和面積,因此可以將這種操作封裝成類的成員函數。基于上述分析,設計如下的三角形類(案例2)。
案例2 Triangle 類的設計

在這一教學案例的設計中,一方面,進一步強化了面向對象分析的基本方法,同時,在類中進行了對象成員的封裝,將現實世界中對象的構造的這一特點出來,結合著具體的實例,將面向對象分析與設計方法更直觀地傳達給學生,使抽象的概念更容易被理解和接受。
C++程序設計語言的核心是進行類的設計中相關語法要素的介紹。對于初次接觸C++語言的學生而言,準確的理解和運用每一個語法要素都是一個不小的挑戰。在C++語言中,非常重要的一個內容是運算符的重載機制。通過運算符的重載,可以采用常規的運算符完成自定義數據類型的一些操作。
對第二節案例中提到的三角形對象而言,在三角形對象的使用過程中,可以對兩個三角形對象的面積大小進行比較。在通常進行的比較操作中,普遍采用關系運算符完成比較操作。但對于自定義類型而言,要使得基于這些類型的對象完成比較操作,必須進行運算符的重載。以此為實例,自然而然的引出運算符重載的概念,使得抽象的概念變的更直觀,更容易被理解和接受。
在引入運算符重載概念的基礎上,對初學者而言,接下來的難點在于函數接口的設計。根據運算符的重載要求,在進行運算重載的過程中,不能改變運算符的語義。由于關系運算符是一個二元運算符,運算結果是布爾值,因此,可以借助于關系運算的這一語義特點確定重載函數的接口。
對于大部分運算符而言,可以以成員函數或友元函數兩種方式進行重載。這兩種重載方式的區別在于形參個數的不同。在以成員函數重載的過程中,只需要一個形式參數(調用該函數的對象作為運算符的第一個操作數,形參作為運算符的第二操作數);在以友元函數重載的過程中需設置兩個形參(第一個形參作為運算符的第一個操作數,第二個形參作為運算符的第二個操作數)。結合C++的語法特點,可以設計如下的案例。
案例3 支持運算符重載的Triangle 類的設計

在上面的實例中,分別采用了成員函數和友元函數的形式分別對大于運算符和大于等于運算符進行了重載。通過這個案例,將運算符重載這一抽象的概念以更直觀的方式進行介紹,進一步強化學生對抽象數據類型的認識。
上面三節通過三個案例的設計,采用由淺入深,由簡到繁的方式,逐步地將面向對象中的基本知識以及相關的語法特點進行了介紹。相比較單純的介紹語法特點而言,通過這些案例的設計,可以很好地將抽象的語法特點通過日常生活中所接觸的直觀的實例進行展示,可以使學生更容易得理解和掌握面向對象程序設計中各種抽象的概念。
面向對象程序設計中除了涉及到類和對象、類的組合、運算符的重載等知識點,還包括繼承和派生、虛函數和多態的抽象且復雜的概念,在相關知識的接受過程中,可以參考前面幾節中關于教學案例的設計理念,將抽象的知識通過直觀的實例進行闡述,可以更好地豐富教學內容,提高課堂教學的效果。