張廣梅,朱紅梅
(山東農(nóng)業(yè)大學信息科學與工程學院,泰安271018)
世界編程語言排行榜TIOBE[1]是根據(jù)互聯(lián)網(wǎng)上有經(jīng)驗的程序員、課程和第三方廠商的數(shù)量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube 統(tǒng)計常用的程序設(shè)計語言的排名數(shù)據(jù)。根據(jù)TIOBE[2]公布的數(shù)據(jù),C++程序設(shè)計語言多年來居于榜單的前三位。
C++程序設(shè)計語言是一種面向?qū)ο蟮某绦蛟O(shè)計語言。相對于結(jié)構(gòu)化的程序設(shè)計語言C 語而言,C++程序設(shè)計語言具有較強的抽象性[3-4],語言的這一特性,導致學生在學習過程中存在著難以入門的情況。針對這一問題,在教學過程中,需要從面向?qū)ο蟪绦蚍治龇椒ǖ慕虒W入手,強化面向?qū)ο蟪绦蛟O(shè)計的基本概念的介紹;在充分介紹面向?qū)ο蟪绦蛟O(shè)計方法特點的基礎(chǔ)上,再用C++語法來解釋面向?qū)ο蟪绦蛟O(shè)計中的基本概念,循序漸進,解決C++程序設(shè)計語言的入門問題。之后通過案例教學,加強學生對程序設(shè)計語言的語法規(guī)則的認識,最終使得學生掌握這門語言,達到能用熟練使用該語言進行編程的能力。為更好地向?qū)W生滲透面向?qū)ο蟮幕靖拍?,使學生能更好的從結(jié)構(gòu)化程序設(shè)計思想過渡到面向?qū)ο蟮某绦蛟O(shè)計思想,需要加強教學過程中教學案例的設(shè)計,通過這些案例,自然而然的將面向?qū)ο蟮母饕厝谌氲秸n程教學中。下面從面向?qū)ο蟪绦蛟O(shè)計基本概念教學入手,對C++程序設(shè)計語言的教學案例的設(shè)計進行探討。
傳統(tǒng)的C++程序設(shè)計語言的教學方法是以語法介紹為主,教學內(nèi)容的組織圍繞著C++程序設(shè)計語言的語法特點展開教學內(nèi)容。從以往的教學過程來看,這種教學模式?jīng)]有突出面向?qū)ο蠓治龅倪^程,脫離了面向?qū)ο蠓椒ǖ谋举|(zhì),學生不能對面向?qū)ο蠓椒ㄓ兄嫦到y(tǒng)的認識,不能很好的完成教學目標。為提升教學效果,要摒棄傳統(tǒng)的以語法為主的教學方法,強化教學案例的設(shè)計,從現(xiàn)實案例出發(fā),以案例分析為主,在案例的分析中,逐漸滲透面向?qū)ο蟮幕靖拍睢?/p>
面向?qū)ο蟮某绦蛟O(shè)計方法是當前的主流程序設(shè)計方法。面向?qū)ο蟪绦蛟O(shè)計方法的特點是從現(xiàn)實世界出發(fā)分析問題從而自然的解決問題?,F(xiàn)實世界是由對象組成,因此面向?qū)ο蟪绦蛟O(shè)計的關(guān)鍵是完成對象的設(shè)計。在面向?qū)ο髴贸绦蛟O(shè)計中,對象是通過類實例化得到的,由此,自然的引出面向?qū)ο蟪绦蛟O(shè)計中類的概念。
在面向?qū)ο蟮膽贸绦蛑校瑢ο蠛皖愔g的關(guān)系是具體和抽象之間的關(guān)系。類型是對具有相同屬性和行為的對象的抽象,對象是對類的實例化。因此,在面向?qū)ο髴贸绦蜷_發(fā)中,首先要進行類的設(shè)計,有了類之后,再由類生成對象。因此在對類這一基本概念的教學案例設(shè)計中,可以從一個簡單、直觀的對象出發(fā),通過對這一對象的分析,抽象出類的基本要素,完成類的設(shè)計。
為闡述類和對象的概念,可以從平面上的點這一對象著手,進行面向?qū)ο笙到y(tǒng)中基本概念的介紹。對于平面上的一個點,是通過其在坐標系中的位置體現(xiàn)出來的,即對于平面上的每個點而言,都有其相應的橫坐標和縱坐標值,可以將這兩個值定義為點對象的數(shù)據(jù)成員?;谶@樣的特點,完成如下類的設(shè)計(案例1)。案例1 Pont 類的設(shè)計
通過這一案例的設(shè)計,完成了類和對象的概念的介紹及類定義的相關(guān)C++語法的介紹,可以讓學生對抽象的概念有更直觀的認識,初步建立面向?qū)ο蠓治雠c設(shè)計的理念。
上一節(jié)中,通過Point 類的設(shè)計,直觀的介紹了類和對象的基本概念。在現(xiàn)實世界中,對象之間存在著包含關(guān)系,即,一個對象可以由其他對象組成。例如,要刻畫平面上的一條線段,只需要定義好線段的起點和終點,即可確定平面上的一條線段;要表示平面上的一個三角形,只要定義好平面上的三個頂點即可完成,即一個三角形是由三個點組成?;诂F(xiàn)實世界的這種特點,在面向?qū)ο蟪绦蛟O(shè)計過程中,可以采用類的組合技術(shù)很好的將現(xiàn)實世界的這一特色體現(xiàn)出來。為使學生更好地理解面向?qū)ο蠹夹g(shù)的這一機制,在教學案例的設(shè)計中,可以在Point 類的基礎(chǔ)上,設(shè)計一個三角形類,結(jié)合這一教學案例進行類的組合技術(shù)的介紹。
根據(jù)幾何學的原理,不再一條直線上的三個頂點可以確定一個三角形,對于要設(shè)計的三角形類而言,該類包含三個數(shù)據(jù)成員,分別表示三角形的三個頂點。對三角形這一對象而言,基本的操作的計算周長和面積,因此可以將這種操作封裝成類的成員函數(shù)?;谏鲜龇治?,設(shè)計如下的三角形類(案例2)。
案例2 Triangle 類的設(shè)計
在這一教學案例的設(shè)計中,一方面,進一步強化了面向?qū)ο蠓治龅幕痉椒ǎ瑫r,在類中進行了對象成員的封裝,將現(xiàn)實世界中對象的構(gòu)造的這一特點出來,結(jié)合著具體的實例,將面向?qū)ο蠓治雠c設(shè)計方法更直觀地傳達給學生,使抽象的概念更容易被理解和接受。
C++程序設(shè)計語言的核心是進行類的設(shè)計中相關(guān)語法要素的介紹。對于初次接觸C++語言的學生而言,準確的理解和運用每一個語法要素都是一個不小的挑戰(zhàn)。在C++語言中,非常重要的一個內(nèi)容是運算符的重載機制。通過運算符的重載,可以采用常規(guī)的運算符完成自定義數(shù)據(jù)類型的一些操作。
對第二節(jié)案例中提到的三角形對象而言,在三角形對象的使用過程中,可以對兩個三角形對象的面積大小進行比較。在通常進行的比較操作中,普遍采用關(guān)系運算符完成比較操作。但對于自定義類型而言,要使得基于這些類型的對象完成比較操作,必須進行運算符的重載。以此為實例,自然而然的引出運算符重載的概念,使得抽象的概念變的更直觀,更容易被理解和接受。
在引入運算符重載概念的基礎(chǔ)上,對初學者而言,接下來的難點在于函數(shù)接口的設(shè)計。根據(jù)運算符的重載要求,在進行運算重載的過程中,不能改變運算符的語義。由于關(guān)系運算符是一個二元運算符,運算結(jié)果是布爾值,因此,可以借助于關(guān)系運算的這一語義特點確定重載函數(shù)的接口。
對于大部分運算符而言,可以以成員函數(shù)或友元函數(shù)兩種方式進行重載。這兩種重載方式的區(qū)別在于形參個數(shù)的不同。在以成員函數(shù)重載的過程中,只需要一個形式參數(shù)(調(diào)用該函數(shù)的對象作為運算符的第一個操作數(shù),形參作為運算符的第二操作數(shù));在以友元函數(shù)重載的過程中需設(shè)置兩個形參(第一個形參作為運算符的第一個操作數(shù),第二個形參作為運算符的第二個操作數(shù))。結(jié)合C++的語法特點,可以設(shè)計如下的案例。
案例3 支持運算符重載的Triangle 類的設(shè)計
在上面的實例中,分別采用了成員函數(shù)和友元函數(shù)的形式分別對大于運算符和大于等于運算符進行了重載。通過這個案例,將運算符重載這一抽象的概念以更直觀的方式進行介紹,進一步強化學生對抽象數(shù)據(jù)類型的認識。
上面三節(jié)通過三個案例的設(shè)計,采用由淺入深,由簡到繁的方式,逐步地將面向?qū)ο笾械幕局R以及相關(guān)的語法特點進行了介紹。相比較單純的介紹語法特點而言,通過這些案例的設(shè)計,可以很好地將抽象的語法特點通過日常生活中所接觸的直觀的實例進行展示,可以使學生更容易得理解和掌握面向?qū)ο蟪绦蛟O(shè)計中各種抽象的概念。
面向?qū)ο蟪绦蛟O(shè)計中除了涉及到類和對象、類的組合、運算符的重載等知識點,還包括繼承和派生、虛函數(shù)和多態(tài)的抽象且復雜的概念,在相關(guān)知識的接受過程中,可以參考前面幾節(jié)中關(guān)于教學案例的設(shè)計理念,將抽象的知識通過直觀的實例進行闡述,可以更好地豐富教學內(nèi)容,提高課堂教學的效果。