999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

關于使用C++講授面向對象程序設計課程的預備知識的探討

2007-12-31 00:00:00戴建國秦懷斌
計算機教育 2007年14期

摘要:很多高校都采用C++語言講解“面向對象程序設計”課程。本文結合實例探討了在學習面向對象技術之前應該做好的兩個方面的準備工作,并從多個角度對這兩個方面做了詳細的論述。

關鍵詞:過程化;面向對象;范型;類

中圖分類號:G642文獻標識碼:A

文章編號:1672-5913(2007)14-0041-04

1引言

面向對象程序設計是計算機科學專業的核心課程,理論性與實踐性并重。很多學校采用C++語言為范例講述面向對象程序設計這門課程。教學內容主要包括面向對象程序設計范型(paradigm)的三個最重要的特性:繼承、封裝和多態,以及C++如何實現這三個特性,使學生掌握面向對象程序設計范型和一種面向對象的編程語言,從而為以后的學習打下基礎。但是,由于存在從過程化編程到面向對象編程思想轉變的突然性和C++語言實現面向對象機制的復雜性,所以在開始講授面向對象部分之前做好充分的準備工作,掌握必要的預備知識是非常重要的,否則學生就會陷入細節的困惑而影響對面向對象編程機制的理解,影響了教學效果,本文從教學實踐經驗出發,根據實際教學體會,試圖在這一方面做進一步探索,結合實例探討在講授C++語言描述的面向對象程序設計課程之前應該掌握的預備知識及其必要性。

2面向對象程序設計的教學現狀

在很多高等院校中,講授面向對象程序設計這一課程時都是使用C++語言描述,因為在大學早期一般都學習過C語言,所以使用C++語言描述可以使學生在學習過程中有銜接感,不至于在基本語法上都感到陌生。正是有了C語言的基礎,所以很容易認為不用做什么準備或者做很少的準備就可以開始面向對象部分的講述。但是存在三個問題:首先,概念上很難轉變。C語言是過程化的語言,關注的是功能的劃分和函數的實現,是一種和面向對象完全不同的編程范型。如果一開始就講授類、對象等面向對象知識,沒有一個合理的鋪墊,會有很強的突兀感,不易接受;其次,C++是一種靈活強大的語言,即使在過程化編程部分也有一些與C語言不同的地方,而這些地方卻往往是C++語言實現面向對象機制的重要部分,如果沒有一個清晰明確的認識,只知其然而不知其所以然,就難以真正掌握C++語言的面向對象部分;再次,講授C語言時重點在于編程的基本概念和程序結構的控制,指針和結構體并不是重點的內容,或者說這些內容剛開始很難完全掌握,而這部分內容在講解面向對象過程中會經常使用,如果不進行回顧就直接在面向對象的教學中使用也會影響教學效果。所以在學習面向對象程序設計之前做好充分的概念和技術上的準備是很重要的,起到了承上啟下的作用。下面就對學習面向對象程序設計之前應該準備的相關知識逐個做一討論。

3應該掌握的預備知識

在開始學習面向對象程序設計之前所要加強或者全新學習的知識主要針對上一節中敘述的問題展開,針對上述三個方面的問題,應該從以下兩個方面,七個具體問題入手。

3.1程序設計理念上的轉變

程序設計理念上的轉變主要是從了解面向對象技術產生的背景出發,理解面向對象技術產生的自然性及其相對于過程化程序設計的優勢,從程序語言發展和設計兩個角度上理解,從而能對面向對象技術有一個全局性的把握。

1.從程序語言發展的角度出發看面向對象程序設計語言出現的必要性及其與過程語言的銜接性。程序設計的發展的目標之一是提高重用性,而提高重用性的方法是提高抽象性,C語言提供的抽象機制是函數,這是過程化程序設計語言的特點。這樣的抽象能力是很有限的,在大型系統的設計中會造成結構復雜、管理困難的現象,同時代碼難以理解、難以維護、難以重用。面向對象語言在這方面顯示了強大的優勢。面向對象技術提供的抽象機制主要是類(Class),也叫做用戶自定義類型,類是一種完全的用戶自定義類型。面向對象程序設計技術可以在很大程度上解決過程化程序設計所面臨的問題。首先,面向對象的設計可以很好地模擬現實世界,大大縮小了現實問題域與程序設計問題域的差距,使得客戶也可以理解設計,對設計的修改和驗證也變得很容易。其次,類封裝了內部屬性,只對外部暴露接口,只要不更改接口,在類的內部所做的任何修改不會對類的使用者造成影響,大大提高了可重用性和可維護性。

2.從設計的角度出發觀察面向對象的設計與過程化設計上的區別。從設計的角度出發學習程序設計很有好處,通過對設計的思考,非常有助于了解某種程序設計范型的優勢和缺點,同樣,通過對面向對象設計的思考,有利于更好的掌握面向對象的技術內涵。舉一個例子,設計圖書館管理系統。如果是過程化設計,關注的是圖書館有哪些功能,每一個功能該怎樣實現,需要哪些函數,這些函數之間應該怎樣相互調用以完成該功能。大概可以這樣設計:分為圖書借閱、圖書整理、人員管理三個部分,如圖1所示。每個部分又劃分為若干子功能,每一個功能都可能成為以后的一個函數。每一個函數可能又調用更小的函數,通過逐級的函數調用完成功能。在面向對象的分析中也劃分功能塊,但只是為了確定需求,設計上與過程化設計大大不同:參與圖書館系統所有的實體都對應設計中的一個類,系統功能的實現通過類之間的交互完成,設計的問題就變成了類以及類之間關系的設計,如圖2所示。通過兩者對比可以看出,面向對象設計更貼近真實、更容易理解。也可以看出,兩者在理念上有多么大的區別。

3.2掌握C++實現面向對象機制所必須的知識

有了編程理念上的轉變,理解了面向對象技術產生的技術需求和面向對象范型的特性,還必須具備掌握C++實現面向對象機制所必須的知識才能很好的理解面向對象技術,這些預備知識是C語言中所缺乏的,可以說,對這些預備知識的良好掌握是理解面向對象技術的關鍵,總結一下有五個方面的內容:

1.引用

引用在面向對象程序設計中十分常用,而且不同的程序設計語言在引用的使用上又不盡相同,比如C++和java的引用就有很大的不同。透徹的理解引用非常重要,但對新手來說很不容易,可以說正確的理解引用機制是學習好面向對象技術的第一步。C語言中沒有引用的概念,需要引用的地方只能用指針去實現。在C++中引用的使用十分普遍,也比較復雜,而且更多的是用在對自定義類型的操作上。對引用的學習應該從使用引用的場合入手,有三個方面的內容,每個方面應分兩個部分講解:格式(怎樣做)和意義(怎樣用)。

●引用型變量。定義一個整型引用型變量yi的格式:

intyi = i;// 變量i是已經被定義過的整型變量

意義:yi是i的別名,兩者指向同一變量,是同一個變量的兩個名字,無論修改誰,變量都將發生修改。

注意事項:引用型變量在定義的時候一定要初始化,不能先定義,再初始化,這一點與java不同。

●引用型參數(傳引用,傳址)。定義引用型參數的格式如下:

返回類型函數名(參數類型參數名){ 函數體 },與非引用參數的不同之處在于參數名前多了一個引用符號“”。

意義:C++默認傳值,也就是說在函數體內對形參做的任何修改不會影響到實參,在函數運行之前先調用實參的拷貝構造函數生成一個臨時變量,這個臨時變量在函數體內部代替形參參與運算,這就是為什么不用引用或者指針就無法通過函數實現交換兩個變量的值,也就是C++中調用拷貝構造函數的時機之一,如果出于效率或者想修改實參,就必須用引用型參數,這樣進入函數體內部參與運算的就是實參本身。

●引用型返回值。定義引用型返回值的格式如下:

返回類型函數名(參數類型參數名){ 函數體 }

意義:函數體內的任何臨時變量在函數運行完畢后都要銷毀,如果要返回某個變量,那么將會調用這個變量所屬類型的拷貝構造函數構造一個臨時變量返回,除非使用引用型返回值。假設有如下程序,其中類A有一個函數fun意圖返回對象自己,我們看它這樣做能辦到嗎?

運行,打印以下結果:

構造函數

拷貝構造

拷貝構造

程序運行結果顯示調用了兩次拷貝構造函數,為什么會這樣呢?兩次拷貝構造函數調用時機為:一次是執行“return *this; ”,編譯器會在以*this為實參構造臨時變量時調用拷貝構造函數,另一次是執行“A a1 = a.fun ();”,編譯器會在以上一步構造的臨時變量為實參初始化a1時調用拷貝構造函數。現在把“A fun (){ return *this; }” 改為“A fun (){ return *this; }”,再運行可以得到如下的結果:

構造函數

拷貝構造

可以看出只在初始化a1時運行了一次拷貝構造函數,返回的正是對象自己。

注意事項:引用型返回值一般用在返回引用型參數(如C++中重載的輸出運算符“<<”),或者返回對象自己(如重載的賦值運算符),不能返回函數體內臨時變量的引用,因為函數運行完畢后臨時變量全部都要銷毀,對象已不存在了,無法返回對象本身[1]。

總結:C++中引用的使用比較復雜,原因在于兩個方面:首先在C++中默認是傳值的,而不是傳址(傳引用),其次在C++中用不同的方法造出來的變量的存儲位置不同、生命周期不同、銷毀方法和銷毀責任也不相同。所以在C++中使用引用要十分小心,需要對引用的透徹理解,而且在某些方面必須使用引用,比如拷貝構造函數。所以可以說學好引用是掌握C++實現面向對象機制的重要的語言基礎。

2.Const關鍵字

在C語言中沒有常量的表示法,如果要定義一個常量只能用#define,這已經被證明非常不好,因為在編譯時將用變量值代替變量名,不利于調試。所以在C++中鼓勵以常量表示法替代#define。定義一個常量的格式如下:

const 類型 變量名 = 初值;

定義常量時一定要同時賦初值,因為常量一旦被賦值就不能修改,如果定義時不賦值,那么常量將會以默認值初始化,這一般都不是我們想要的。Const不但能修飾一般變量使之成為常量,也可以修飾引用和指針,在這里我們著重討論const與引用結合的情況:在引用使用的三種場合怎樣使用const以及跟C++實現面向對象技術的關系。

●定義常引用變量

定義一個常引用變量的格式如下:

const類型 變量名 = 某個已定義的變量名

意義:不能改變常引用使之指向另一個對象,也不能通過常引用去改變該引用所指向的對象的值。

●常引用型參數

返回類型函數名(const參數類型參數名){ 函數體 },跟引用參數的不同之處在于參數類型前多了一個常量符號“const”。

意義:當需要明確的表示不希望函數對實參修改,但是為了效率或者其他的原因又需要引用型參數時,可以使用常引用型參數。使用常引用型參數的一個常見場合是拷貝構造函數和賦值運算符的重載。拷貝構造函數必須使用引用型參數,原因在于如果傳值,那么在實參傳入之前會調用編譯器提供的默認的拷貝構造函數來構造一個實參的副本,這樣已經失去了自己寫拷貝構造函數的意義。

●常引用型返回值

const返回類型函數名(參數類型參數名){ 函數體 }

意義:當使用引用型返回值時,可以直接對返回值進行修改,當不想修改函數的返回值時,可以使用常引用型返回值。

3.函數重載

C語言不提供函數重載,完成相似功能的函數必須使用不同的名稱。這樣造成在大型程序開發中,給函數命名很難。C++解決了這個問題,當然C++必須要解決這個問題,原因在于構造函數名必須要與類名相同,而構造函數又不能將參數固定,就是要允許用不同的參數列表去初始化對象,C++提供了函數重載。所以學好函數重載是掌握構造函數的一個重要基礎。函數重載的要求:1)函數名相同;2)參數列表不同。參數類型,個數或順序(不提倡僅僅是順序)不同。3)不能使用返回值重載[2],原因在于調用函數時可以僅僅利用函數的副作用,也就是不取得函數的返回值。

4.new與delete

在C語言中分配和回收內存是用malloc和free,轉到C++上之后,應該完全使用new與delete,原因在于malloc和free對構造函數和析構函數一無所知[1],使用new與delete構造和刪除對象會自動調用該對象所屬類型的構造函數和析構函數,也會調用該類型內所有自定義類型的成員對象的構造函數和析構函數,而這些是malloc和free無法做到的。也就是new和delete可以做malloc和free所做的所有事情,而且做的更好,還可以適用于自定義類型的構造和析構,所以在學習了C++以后所有分配和銷毀內存的事情應該交給new與delete去做。

5.cout與cin

C語言的輸入輸出是調用printf和scanf函數,它不能判斷輸入輸出的對象類型,必須進行參數設置,不能實現對用戶自定義類型的輸入和輸出,而且格式復雜。cout與cin是C++的標準輸入輸出流對象,它們可以用在任何重載了“<<”和“>>”運算符的對象上以實現輸入和輸出,不管基本類型還是自定義類型都可以直接輸入輸出,而且有多種格式化函數可以調用,所以在學習了C++后,所有的輸入輸出都應用使用cout和cin,不過,這一部分內容可以放到運算符重載的章節重點講解。

4結論

俗話說“工欲善其事,必先利其器”,在理解面向對象程序設計技術的內涵,學習C++語言實現面向對象機制之前,掌握好這些基礎知識是很重要的,它們就相當于“器”。重要的概念,比如說引用、Const關鍵字和函數重載可以先講,其余的內容可以放到它們出現的章節中進行重點講解,但是這些內容不容忽視,否則會給理解面向對象技術的內涵造成很大的障礙。

The Discussion about preliminary knowledge in teaching object oriented programming course in C++

Abstract: Many universities use C++ to teach the course: object oriented programming. The paper discusses two preliminary works that should do before study the object oriented technology: 1. Programming thought changing from procedural paradigm to object oriented paradigm; 2. The preliminary technologies that the C++ programming language used to realize object oriented technology. The paper gives elaborate discussion for the two aspects above too.

Keywords: procedural; object oriented; paradigm; class

參考文獻

[1] Scott Meyers. Effective C++中文版(第二版)[M]. 侯捷 譯. 武漢:華中科技大學出版社,2001.

[2] Bjarne Stroustrup. C++程序設計語言(特別版)[M]. 裘宗燕 譯. 北京:機械工業出版社,2002.

[3] 馬艷. 提高”C++語言程序設計”課程教學效果之我見[J]. 新疆廣播電視大學學報,2005,9(29):49-51.

[4] 陳真,王釗. C++面向對象程序設計中的構造函數[J]. 電氣電子教學學報,2006,28(6):83-85.

[5] 劉曉剛. 用多種手段教學C++課程[J]. 湖北廣播電視大學學報,2003,21(3):48-50.

作者簡介

戴建國,石河子大學信息科學與技術學院教師,專業方向為軟件工程。

郭理,石河子大學信息科學與技術學院教師,專業方向為人工智能。

秦懷斌,石河子大學信息科學與技術學院教師,專業方向為軟件工程。

主站蜘蛛池模板: 国产一区二区人大臿蕉香蕉| 97影院午夜在线观看视频| 国产精品视频猛进猛出| 97国产精品视频人人做人人爱| 一本色道久久88综合日韩精品| 就去吻亚洲精品国产欧美| 亚洲狠狠婷婷综合久久久久| 日韩一二三区视频精品| 婷婷综合色| 99爱视频精品免视看| 久久精品日日躁夜夜躁欧美| 日韩免费成人| 青青草原国产免费av观看| 久久婷婷色综合老司机| 97在线国产视频| 国产剧情一区二区| 91青青草视频| 曰韩人妻一区二区三区| 99福利视频导航| 福利一区在线| 亚洲国模精品一区| 免费国产高清精品一区在线| 亚洲大学生视频在线播放| 2022国产91精品久久久久久| 麻豆AV网站免费进入| 午夜a级毛片| 91久久性奴调教国产免费| 在线va视频| 亚洲人成影院午夜网站| 色综合国产| 精品丝袜美腿国产一区| 色综合网址| 日本免费a视频| 亚洲二区视频| 国产另类视频| 欧美精品亚洲二区| 青青草综合网| 亚洲国产精品VA在线看黑人| 真实国产乱子伦高清| 久久久久人妻一区精品色奶水| 91高清在线视频| 成年免费在线观看| 欧美国产日韩在线| 呦视频在线一区二区三区| 潮喷在线无码白浆| 久久中文字幕不卡一二区| 色综合久久综合网| 婷婷色中文| 欧美一区中文字幕| 国产91小视频| 精品国产中文一级毛片在线看| 亚洲va在线观看| 99精品福利视频| 国产自产视频一区二区三区| 久久五月天国产自| a色毛片免费视频| 日本影院一区| 在线国产欧美| 福利国产微拍广场一区视频在线 | 亚洲天堂久久新| 亚洲人成网站在线播放2019| 欧美成人精品一级在线观看| 亚洲高清日韩heyzo| 欧美a在线看| 欧类av怡春院| 亚洲中文字幕久久精品无码一区| 秋霞午夜国产精品成人片| 国产在线八区| 国产精品污污在线观看网站| 亚洲欧美日韩精品专区| 最新精品国偷自产在线| 亚洲欧美一级一级a| 日韩无码真实干出血视频| 2020精品极品国产色在线观看 | 亚洲天堂在线免费| 国产主播一区二区三区| a网站在线观看| 亚洲国产精品人久久电影| 国产极品美女在线| 色一情一乱一伦一区二区三区小说| 9啪在线视频| 国产性爱网站|