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