摘要:作為面向對象程序設計方法的示范性語言,C++以其高效、靈活獨特的語言機制在計算機科學的教育和各個領域被廣泛的應用,該文結合多年教學經驗,分析一些C++初學者的問題與困惑,提出幾點適合C++學習者的學習方法和技巧,對提升C++程序設計學習者的學習質量將起到積極的意義。
關鍵詞:面向對象;高級語言;編程;匯編工具
中圖分類號:G642文獻標識碼:A文章編號:1009-3044(2009)32-8982-02
Enhance the C++ Programming Courses of the Quality of Learning Methods
GAO Yong-li
(Chuxiong Normal University, Computer Science Department, Chuxiong 675000, China)
Abstract: As a method of object-oriented programming language model, C++ for its efficient and flexible mechanism for the unique language of computer science in various fields of education and has been widely used for many years teaching experience in this paper, analysis of some C++ beginners Problems and confusion, to make a few for C++ learner's learning methods and techniques to enhance the C++ programming of the quality of learning the learner will play a positive significance.
Key words: object-oriented; high-level language; programming; compilation tools
C++語言是面向對象的高級程序設計語言,從最早的C語言開始,它的發展貫穿于整個計算機發展的過程,其高效、靈活獨特的語言機制在計算機科學的各個領域被廣泛的應用。其后產生的C#,JAVA等語言,都是以面向對象程序設計思想為基礎,在其上進行演變和擴充的,面向對象的設計思想是在原來結構化程序設計方法基礎上的一個質的改變,C++很好地體現了面向對象的基本特性。該文通過對近幾年C++教學進行經驗總結,闡述C++語言的一些學習方法和技巧,希望對初學者有所幫助。
1 三種提升學習質量的方法
1.1 試著大量閱讀程序,學習編程思想與方法
在C++課程的教學中,經常發現很多初學者熱衷于語法的學習,在某一種概念類型的表示上,或者某一種語法的格式上,認真的研讀,原因之一是他們對某一個程序調試老不通過,主要原因可能就是寫錯了一個標點或標識符的事情記憶深刻,同時也源于我們出考試題的時候喜歡出各種各樣的語法題考學生。你可能要問:那學程序設計語言不學語法學什么呢?是的,學程序設計語言當然要知道語法,但要學好一門語言課最重要的是學會它的編程思想與方法,這就好比蓋房子,只學會語法,你只能是個泥水匠,只有懂得了編程思想與方法,你才有可能變成建筑師。學會程序設計的編程思想與方法,說起來容易做起來難,我給大家推薦的方法是大量的讀程序,對,你沒有看錯,你不需要一開始就動手編程解決問題,但你應該嘗試帶著你的思想去大量讀程序,看看別人對這個問題是怎么考慮的,為什么可以這樣做,如果是你想得到這樣編嗎?在讀的過程中,不僅要學習別人的編程思想,還要注意良好的編程習慣,不要嫌它的標識符太長,因為從幾十行的小程序讀到幾百行甚至幾千行的大程序,你會發現一個見名識義的標識符對你讀懂程序有多重要,另外象如下的兩個語句,你會使用哪一種呢?1) int flag=0 …..if(flag)…..2) int flag=0……if(flag=1)……,我在看同學的程序設計時大量看到第2種編法,很樸實,但你得改正。在讀程序的過程中,對于你不懂的地方,你自然而然就會去翻閱資料,查教材,語法對你來說就這樣掌握了。而通過大量閱讀,你會漸漸對一類問題產生概念,形成一定思維方式,這樣,你可以試著解決一些小問題了。
1.2 注意一些概念引入的原因和用法
如果我問你什么是const,什么是static?你可能想都不想就告訴我:常類型和靜態類型的修飾符啊,這個回答有什么問題嗎?似乎沒有,但我問在一個類當中,什么樣的成員屬性要使用static? 你能夠給我舉個在函數中const很有用的例子嗎?或者有這樣一個語句,已知:Ta是一個類,成員函數說明如下:Ta::test(const Ta a),你知道這里的const有什么用嗎?你是否能夠會心一笑,輕松回答我。還是當你看到這里,正在為回答我的問題而急急忙忙翻書?對C++中的一些概念,我們不能簡簡單單讀讀它的定義,看上幾個什么也說明不了的教材上的例子,就以為已經學懂了,還是引用我前面說過的方法,去找一些帶有這些概念關鍵字的程序讀讀吧,真正體會這些概念的含義和使用場合。
1.3 學習使用匯編工具來解釋你不理解的程序執行過程
作為計算機相關專業的同學,一定都學過一個東西——匯編語言,好了,試著用C++的匯編指令來幫助你了解C++的執行過程吧,順便你會學到一些C++底層的東西,它甚至可以幫你理解一些你想破腦袋也無法理解的程序執行結果,舉個例子:已知i=6,(++i)+(++i)+(++i)等于幾,你可能會憤怒,出這種題有意思嗎?但如果你必須回答,答案是25,有多少人會答對,這不怪你,題目夠無聊,但先不談題目出的合不合理,即使我告訴你答案,你知道為什么嗎?我現在把C++的匯編給你,你就知道了,以下是(++i)+(++i)+(++i)的匯編碼:
// i 的值存放在[ebp-4]中,a的值存放在[ebp+8]中
1 mov eax,dword ptr [ebp-4]
2 add eax,1
3 mov dword ptr [ebp-4],eax
//1-3步實現++i的操作,此時i=7
4mov ecx,dword ptr [ebp-4]
5 add ecx,1
6 mov dword ptr [ebp-4],ecx
// 4-6步實現上步得到的i(7)再加1的操作,此時i=8
7 mov edx,dword ptr [ebp-4]
8add edx,dword ptr [ebp-4]
// 問題在此,本意是將第一步的++i與第二步的++i相加,存放在edx中
// 但第二步的值已經覆蓋了第一步的值,因此得出的值為16,而正確值是15
// 此時edx=16
9mov eax,dword ptr [ebp-4]
10add eax,1
11 mov dword ptr [ebp-4],eax
// 9-11步實現第三步++i操作,此時i=9
12 add edx,dword ptr [ebp-4]
13mov dword ptr [ebp+8],edx
//12-13步將第三步++i的值[ebp-4]與前兩步之和(edx)相加,結果為25
再舉一個例子,大家知道this指針是由C++系統自動提供的指向對象的特殊指針,用來指向正在對某個成員函數進行操作的對象,一般情況下,該指針是隱藏使用的,很多同學不理解它存在的意義,看如下一段程序:
1 #include
2 class A
3{
4public:
5A() {a=b=0;}
6A(int i,int j) { a=i; b=j;}
7void copy(A aa);