文章編號:1962-5913(2008)11-0074-02
摘要:“C++程序設(shè)計”中基于對象部分概念對于初學(xué)者來說抽象、難以理解,本文用筆者的經(jīng)驗介紹了如何用學(xué)生能夠理解的事例來解釋這些復(fù)雜的概念,從而節(jié)省學(xué)時、提高效率。
關(guān)鍵詞:C++;基于對象;概念;事例;教學(xué)方法
中圖分類號:G642
文獻標識碼:B
近年來,支持面向?qū)ο蠹夹g(shù)的C++語言越來越多地被高校選為計算機教學(xué)的入門教學(xué)語言。但是由于C++牽涉概念很多,語法比較復(fù)雜,內(nèi)容十分廣泛,作為入門的教學(xué)語言有其天然的困難,學(xué)生感到學(xué)習(xí)難度較大,難以入門,如果只是就理論講理論,照本宣科只能使學(xué)生厭倦疲勞,昏昏欲睡,學(xué)生不但記不住,還會產(chǎn)生逆反心理。但好在程序設(shè)計語言是人們根據(jù)從現(xiàn)實生活實踐中抽象出來的經(jīng)驗而創(chuàng)造的,C++更是如此,那么就是說,各種概念總能在現(xiàn)實生活中找到原型。若能在教學(xué)中運用最能反映概念本質(zhì)的事例去解釋看似復(fù)雜的概念,就能達到快速理解概念及其現(xiàn)實意義的目的,能使教學(xué)脫離枯燥的概念講解,活躍課堂氣氛、形象直觀、易于理解、便于記憶,從而激發(fā)學(xué)生的學(xué)習(xí)興趣,產(chǎn)生良好的教學(xué)效果。
C++基本編程的過程無非是根據(jù)實際需要創(chuàng)造出一系列類,安排好類與類之間的關(guān)系,由類去生成對象,然后指揮一個個對象去完成一系列任務(wù)。由此特點并通過教學(xué)實踐,我一般用人(或人體)這個概念來講解基于對象部分的一些概念,感覺是比較恰當?shù)模梢允箤W(xué)生快速抓住這些概念的實質(zhì)。當然也可以對每個概念分別用不同的事例去解釋,但這樣做可能會導(dǎo)致學(xué)生缺乏知識的連貫性和對總體的把握,最好的辦法是用一個例子從始至終地進行講解。下面對一些基于對象的概念進行初步討論。
1類和對象
對象的類型稱為類,類代表了某一批對象的共性和特征。類是對象的抽象,對象是類的具體實例。類是抽象的,不占用內(nèi)存,而對象是具體的,占用存儲空間。
對于人(體)來說。所有人都是屬于人類這一概念的,人類這一概念具有每一個具體的人的共性和特征。人類這個概念是對每一個具體人的抽象,具體的一個人是人類這一概念的具體實例。人類這個概念是存在于人的頭腦中的,可以認為不占現(xiàn)實空間,而作為具體的人是在現(xiàn)實中占空間的。這樣講解可以使學(xué)生明確類和對象的關(guān)系與區(qū)別。
2private、public、protected成員
private、public、protected主要是用來聲明成員訪問權(quán)限的關(guān)鍵字。一般做法是將需要被外界調(diào)用的成員指定為public,不準備為外界調(diào)用而是為本類中的成員函數(shù)所調(diào)用的,指定為private?;趯ο蟛糠謺簳r不討論private和protected的區(qū)別。
對于人(體)來說。心臟,肺臟等等都可以認為是private成員,是不允許外界直接調(diào)用的。而耳、眼等感覺器官可以認為是public成員,因為它們可以被外界直接調(diào)用。上課時可以舉個簡單的例子,讓學(xué)生深呼吸一下。然后解釋,教師是通過學(xué)生的public成員(耳)來調(diào)用private成員(頭腦和肺),并且只能通過public成員來調(diào)用private成員,否則危險性是很明顯的?;蛘吆蛯W(xué)生解釋,課堂上教師就是通過調(diào)用每個人的耳朵和眼睛這些可以看作是公用部分的器官來調(diào)用大腦等這些可以看成私有部分的器官來達到授課目的的,并且顯然通過公用部分調(diào)用私有部分比直接調(diào)用私有部分安全得多。這樣的講解可以使學(xué)生馬上就能記住private、public等成員的區(qū)別和該如何劃分。
3封裝和信息隱蔽
將多個項目(比如變量和函數(shù))合并到一個包(比如類的一個對象)中,這個過程稱為封裝。類的公用接口與私有實現(xiàn)的分離形成信息隱蔽。
對于人(體)來說,顯然如果不封裝起來那么是很危險的(別人看起來也是很恐怖的)。人體對外界開放的只是一些公用接口,這些接口(如各個感覺器官)的作用是把外界的信息(消息)轉(zhuǎn)化成身體各部分能夠接受和處理的信號,并且只有通過這些公用接口轉(zhuǎn)化的信息才能夠被人識別。得到消息之后人去做某件事的具體實現(xiàn)是不需要發(fā)布消息的人知道的,即如果讓一個人去做某件事,沒必要了解他(她)先邁哪一條腿,走多少步,到什么地方,如何做等各個細節(jié)。只需要告訴他(她)去做什么事情即可,如何去做是不需要關(guān)心的(前提是那個人知道如何做,即相對于程序來說就是“方法”已經(jīng)事先編好了)。封裝與信息隱蔽是比較抽象的概念,相信這樣的講解學(xué)生就能很好地理解了。
4對象、方法和消息
類的成員函數(shù)在面向?qū)ο蟪绦蚶碚撝斜环Q為“方法”,“方法”是指對數(shù)據(jù)的操作。外界通過發(fā)“消息”來激活有關(guān)的方法。所謂“消息”,其實就是一個命令,由程序語句來實現(xiàn)。
人體經(jīng)過封裝之后,成為了一個對象,他(她)能夠做的事情取決于自身的各項能力(方法),外界通過給他(她)一個命令任務(wù)(消息),他(她)運用自己的能力(方法)去完成這個任務(wù)。這樣就很容易理解三者之間的關(guān)系。
5構(gòu)造函數(shù)的意義
構(gòu)造函數(shù)是一種特殊的成員函數(shù),處理對象的初始化,與其他成員函數(shù)不同,不需要用戶來調(diào)用它,而是在建立對象時自動執(zhí)行。
人體在出生時必須具有一些正常的生理機能,這就是人體生理方面的初始化,這由基因自行決定。或者說,在人步入社會開始工作之前,必需經(jīng)過一定時間的學(xué)習(xí)培訓(xùn),否則無法完成基本的工作,這就是人在知識技能方面上的初始化,這由所受的教育決定。構(gòu)造函數(shù)可以看成是對象在使用前的一些必要的初始化。
6析構(gòu)函數(shù)的意義
析構(gòu)函數(shù)也是一個特殊的成員函數(shù),它的作用與構(gòu)造函數(shù)相反,當對象的生命期結(jié)束時,會自動執(zhí)行析構(gòu)函數(shù)。析構(gòu)函數(shù)的作用并不是刪除對象,而是在撤銷對象占用的內(nèi)存之前完成一些清理工作。只要對象的生命周期結(jié)束,程序就自動執(zhí)行析構(gòu)函數(shù)來完成這些工作。
這個概念解釋起來可能會沉重一些。人在去世之后會有一些善后要做,這可以看成類似于析構(gòu)函數(shù)的作用。區(qū)別只不過是程序中的析構(gòu)函數(shù)是在對象被撤銷之前執(zhí)行,而人的善后主要是在人去世之后進行的,當然立遺囑這件事是在去世之前完成的。
7調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序
基于對象部分中的調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序是先構(gòu)造的后析構(gòu),后構(gòu)造的先析構(gòu),相當于一個棧,先進后出。
調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序體現(xiàn)的是系統(tǒng)對對象的釋放順序。從而可以這樣解釋,單個人作為一個對象,他(她)可能參加一些組織,比如公司、小組等,一般創(chuàng)建這個小組的人是很重要的人,他(她)可能掌握很多重要的東西,如果想最安全地、避免混亂地撤銷這個組織,最好的方法就是先撤銷不重要的人,最后才撤銷重要的人。這如同如果用手工的方式去拆毀一個大樓,選擇的順序肯定是由高層逐層向下拆除,否則危險性實在是太大了。
8友元
友元可以訪問與其有好友關(guān)系的類中的私有成員。友元包括友元函數(shù)和友元類。
現(xiàn)實生活中,一個人對待不同來源的消息的態(tài)度是不同的。可能更相信某些消息渠道(可看作友元函數(shù))或某些人(可看作友元類)發(fā)布的消息,而不會太相信不信任的渠道或人所提供的消息。這點可以說明一個人(對象)可以允許外界的某些事物(可靠的渠道或可靠的人)比較直接地訪問自己的私有事物(比如頭腦中對某件事的判斷)。
通過以上論述,可知也可以用公司這個概念來解釋基于對象的部分概念。如果將公司細分,比如細分到部門還是可以滿足基于對象的一些特征的。但是如果細分到單個人就要用另一個層面的概念來解釋對象了,就像本文所說那樣。對于公司和人這兩個例子,可能人(體)更適合一般的學(xué)生,這是由他們所處的年齡段決定的,他們對公司等概念可能還不太熟悉。其實還可以找到更加恰當?shù)母拍顏斫虒W(xué),比如根據(jù)所面對學(xué)生的特點,如所學(xué)專業(yè)等。還有一些基于對象的概念在本文中并沒有解釋,不過是可以類推的,在此不一一贅述。
參考文獻
[1] 譚浩強. C++程序設(shè)計[M]. 北京:清華大學(xué)出版社,2004.